[安卓/flutter]给Media3.exoplayer编译扩展ffmpeg解码器

/ 2,975评论 / 22851阅读 / 2点赞

前言

引用文档

准备

配置NDK 、cmdtools、SDKManager

cd {你想放NDK的目录}
wget {官网复制Linux版的下载链接}
unzip {刚刚下载的zip文件}
cd {cmdline-tools目录}/bin
sudo ./sdkmanager --licenses --sdk_root={你的NDK的根目录}

编译ffmpge

NDK_PATH="$(pwd)"
cd {你想放Media3.decoder_ffmpeg的目录}
git clone https://github.com/androidx/media --depth 1
cd media
FFMPEG_MODULE_PATH="$(pwd)/libraries/decoder_ffmpeg/src/main"
Lunux执行:
HOST_PLATFORM="linux-x86_64"

MacOX执行:
HOST_PLATFORM="darwin-x86_64"
ANDROID_ABI=21
cd {你想放ffmpge源码的目录}
git clone git://source.ffmpeg.org/ffmpeg && \ cd ffmpeg && \ git checkout release/6.0 && \ FFMPEG_PATH="$(pwd)"
ENABLED_DECODERS=(vorbis opus flac alac pcm_mulaw pcm_alaw mp3 amrnb amrwb aac ac3 eac3 dca mlp truehd)
cd "${FFMPEG_MODULE_PATH}/jni"
ln -s "$FFMPEG_PATH" ffmpeg
./build_ffmpeg.sh \ "${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ANDROID_ABI}" "${ENABLED_DECODERS[@]}"
cd {开头放Media3.decoder_ffmpeg的目录}
./gradlew lib-decoder-ffmpeg:assembleRelease

项目引入ffmpge的aar包


dependencies {
    implementation(fileTree('libs'))
}
import java.util.zip.ZipEntry
import java.util.zip.ZipFile

// 把aar拷贝进入主项目的方法 com.example.android_control换成你自己的插件包名
// * 只修改下面这一行的参数就可以了
copyAar2Host('com.example.android_control')

// 拷贝aar的方法
static aarFileCopy(String srcPath,String desPath) {
    System.out.println("copy aar from <<${srcPath}>> to <<${desPath}>>")
    try {
        FileInputStream fis = new FileInputStream(srcPath)
        FileOutputStream fos = new FileOutputStream(desPath)
        byte[] data = new byte[1024*8]
        int len = 0
        while ((len = fis.read(data))!=-1) {
            fos.write(data,0,len)
        }
        fis.close()
        fos.close()
    }catch(Exception e) {
        e.printStackTrace()
    }
}

void copyAar2Host(String pluginGroup) {
    Project currentProject = null
    Project appProject = null
    rootProject.allprojects.each {
        p->
            boolean  isApp = p.plugins.hasPlugin("com.android.application")
            println("<<${p.name}>> isHost ? ${isApp}")
            if (p.group == pluginGroup) {
                currentProject = p
                println("Plugin project name is $currentProject")
            }
            if(isApp) {
                appProject = p
                println("Host project name is <<${p.name}>>")
            }
    }
    Set<File> aarFiles = new HashSet<File>()
    if (appProject != null && currentProject != null) {
        File libs = new File("${currentProject.projectDir}","libs")
        if(libs.isDirectory()) {
            libs.listFiles().each {
                f->
                    if(f.name.endsWith(".aar")) {
                        println("The aar file name to be copied is <<${f.name}>>")
                        aarFiles.add(f)
                    }

            }
        }
        if (!aarFiles.isEmpty()) {
            File applibs = new File("${appProject.projectDir}${File.separator}libs")
            if(!applibs.isDirectory()) {
                applibs.mkdirs()
            }
            aarFiles.each {
                f->
                    File copyAar = new File("${appProject.projectDir}${File.separator}libs",f.name)
                    if(!copyAar.exists()) {
                        copyAar.createNewFile()
                        aarFileCopy(f.path,copyAar.path)
                    } else {

                    }
            }
            appProject.dependencies {
                implementation fileTree(dir:"${appProject.projectDir}${File.separator}libs",include:["*.jar","*.aar"])
            }
        }
    }
}

repositories{
    flatDir {
        dirs 'libs'
    }
}
apply plugin: 'com.android.library'
// 在这里插入下面这一行
apply from: './aar_tools.gradle'

// 然后找到dependencies块,
dependencies {
    // 这一行导入刚刚libs目录内的ffmpge的arr包

    compileOnly(fileTree("libs"))
    // 这里用于解决用android studio打开项目的android目录时里面的java/kotlin文件的import都是灰色的问题
    compileOnly files("$flutterRoot/bin/cache/artifacts/engine/android-arm/flutter.jar")
    compileOnly("androidx.annotation:annotation:1.3.0")
}

在代码里引入ffmpeg


import androidx.media3.decoder.ffmpeg.FfmpegAudioRenderer;

class FfmpegRenderersFactory extends DefaultRenderersFactory {
    public FfmpegRenderersFactory(Context context) {
        super(context);
        setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);
    }

    @Override
    protected void buildAudioRenderers(Context context, int extensionRendererMode, MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, AudioSink audioSink, Handler eventHandler, AudioRendererEventListener eventListener, ArrayList<Renderer> out) {
        out.add(new FfmpegAudioRenderer(eventHandler, eventListener, audioSink));
        super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, audioSink, eventHandler, eventListener, out);
    }
}

ExoPlayer.Builder builder = new ExoPlayer.Builder(context);
// 添加ffmpeg

builder.setRenderersFactory(new FfmpegRenderersFactory(context));
ExoPlayer player = builder.build();
  1. JamesRok说道:

    lasix 100 mg tablet: furosemide online – furosemide 100mg

  2. JamesRok说道:

    lisinopril generic price in india: how much is lisinopril 40 mg – lisinopril 10 mg pill

  3. StanleyMaf说道:

    lipitor 10mg buy lipitor 20mg lipitor 5mg

  4. StanleyMaf说道:

    lasix furosemide online furosemide 100 mg

  5. DanielDrync说道:

    buy misoprostol over the counter http://lisinopril.guru/# lisinopril 5mg pill
    furosemide 100 mg

  6. DanielDrync说道:

    buy cytotec https://tamoxifen.bid/# nolvadex online
    lasix 40 mg

  7. DanielDrync说道:

    cytotec online http://lisinopril.guru/# website
    lasix 100 mg tablet

  8. StephenJonge说道:

    https://cytotec.pro/# purchase cytotec

  9. JamesRok说道:

    lasix online: buy furosemide – lasix online

  10. StanleyMaf说道:

    lisinopril 20 mg sale Lisinopril online prescription lisinopril

  11. DanielDrync说道:

    purchase cytotec https://lisinopril.guru/# can i buy lisinopril over the counter in canada
    lasix 40mg

  12. JamesRok说道:

    furosemide 100mg: cheap lasix – furosemida

  13. JamesRok说道:

    liquid tamoxifen: buy tamoxifen citrate – tamoxifen men

  14. StephenJonge说道:

    http://cytotec.pro/# п»їcytotec pills online

  15. StephenJonge说道:

    http://cytotec.pro/# Cytotec 200mcg price

  16. StanleyMaf说道:

    lipitor 20 mg where to buy buy lipitor 20mg lipitor 10mg price in india

  17. Hi there, just became alert to your blog through Google, and found that it’s truly informative. I’m going to watch out for brussels. I will appreciate if you continue this in future. Numerous people will be benefited from your writing. Cheers!

  18. DanielDrync说道:

    cytotec buy online usa https://lisinopril.guru/# lisinopril uk
    lasix tablet

  19. DanielDrync说道:

    cytotec online https://tamoxifen.bid/# nolvadex pct
    lasix

  20. DanielDrync说道:

    Abortion pills online http://lisinopril.guru/# lisinopril 20 mg daily
    lasix 100 mg tablet

  21. StephenJonge说道:

    https://lisinopril.guru/# lisinopril diuretic

  22. StephenJonge说道:

    http://tamoxifen.bid/# tamoxifen hot flashes

  23. DanielDrync说道:

    cytotec pills buy online http://furosemide.win/# furosemide 100mg
    furosemide

  24. StephenJonge说道:

    http://lisinopril.guru/# lisinopril 20 mg tablet

  25. StephenJonge说道:

    https://cytotec.pro/# buy cytotec pills online cheap

  26. StanleyMaf说道:

    tamoxifen warning Purchase Nolvadex Online tamoxifen for breast cancer prevention

  27. StanleyMaf说道:

    lisinopril cost Buy Lisinopril 20 mg online lisinopril 30 mg tablet

  28. DanielDrync说道:

    cytotec buy online usa https://lisinopril.guru/# lisinopril 2018
    lasix 40mg

  29. DanielDrync说道:

    п»їcytotec pills online https://cytotec.pro/# buy cytotec pills online cheap
    lasix dosage

  30. JamesRok说道:

    tamoxifen bone pain: Purchase Nolvadex Online – is nolvadex legal

  31. DanielDrync说道:

    cytotec pills buy online https://furosemide.win/# furosemide 100 mg
    lasix dosage

  32. JamesRok说道:

    cost of lipitor in canada: Atorvastatin 20 mg buy online – price canada lipitor 20mg

  33. JamesRok说道:

    buy cytotec in usa: buy cytotec online – order cytotec online

  34. StanleyMaf说道:

    tamoxifen adverse effects Purchase Nolvadex Online tamoxifen menopause

  35. DanielDrync说道:

    buy cytotec in usa http://lisinopril.guru/# lisinopril 1 mg tablet
    lasix 40 mg

  36. StanleyMaf说道:

    tamoxifen postmenopausal Purchase Nolvadex Online nolvadex estrogen blocker

  37. StephenJonge说道:

    https://tamoxifen.bid/# buy tamoxifen

  38. StephenJonge说道:

    https://lipitor.guru/# lipitor over the counter

  39. temp mail说道:

    The degree of my admiration for your work is as substantial as your own sentiment. Your visual display is tasteful, and the authored content is stylish. However, you appear apprehensive about the possibility of delivering something that may be viewed as questionable. I believe you’ll be able to rectify this matter efficiently.

  40. StephenJonge说道:

    https://tamoxifen.bid/# nolvadex 20mg

  41. JamesRok说道:

    lipitor 40 mg: buy atorvastatin online – cost of generic lipitor in canada

  42. StephenJonge说道:

    http://cytotec.pro/# buy cytotec

  43. JamesRok说道:

    lipitor 10mg price in india: Atorvastatin 20 mg buy online – lipitor 20mg price

  44. DanielDrync说道:

    buy cytotec online https://lisinopril.guru/# lisinopril 0.5 mg
    furosemida

  45. JamesRok说道:

    furosemide 40 mg: cheap lasix – lasix 40mg

  46. DanielDrync说道:

    buy cytotec online fast delivery http://lisinopril.guru/# zestril 25 mg
    furosemida

  47. DanielDrync说道:

    Cytotec 200mcg price https://lipitor.guru/# canadian pharmacy lipitor
    lasix side effects

  48. DanielDrync说道:

    cytotec abortion pill https://lisinopril.guru/# where to buy lisinopril without prescription
    lasix 100 mg

  49. JamesRok说道:

    Cytotec 200mcg price: buy misoprostol tablet – order cytotec online

  50. StephenJonge说道:

    https://lipitor.guru/# purchase lipitor

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注