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

/ 3,129评论 / 23545阅读 / 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. сейфы说道:

    Здесь можно преобрести сейфы простые купить сейф

  2. Robertmep说道:

    https://erepharm.com/# best ed pill ere pharm

  3. Тут можно преобрести противопожарный сейф пожаростойкие сейфы

  4. DennisBob说道:

    Kam Pharm: Kam Pharm – buy kamagra oral jelly Kam Pharm

  5. CurtisTraup说道:

    buy ed pills best ed pills online buy ed pills

  6. This is the right blog for anyone who wants to find out about this topic. You realize so much its almost hard to argue with you (not that I actually would want…HaHa). You definitely put a new spin on a topic thats been written about for years. Great stuff, just great!

  7. DennisBob说道:

    buy kamagra oral jelly Kam Pharm: cheapest Kamagra Kam Pharm – buy kamagra oral jelly Kam Pharm

  8. Lloydlania说道:

    http://furpharm.com/# furosemide furpharm.com

  9. Robertmep说道:

    http://gabapharm.com/# buy gabapentin online

  10. CurtisTraup说道:

    erepharm pills erepharm pills best ed pill ere pharm

  11. DennisBob说道:

    kamagra oral jelly: Kam Pharm – kamagra oral jelly

  12. CurtisTraup说道:

    erepharm.com ED meds online buy ed pills

  13. profi teh remont说道:

    Сервисный центр предлагает срочный ремонт парогенератора maestro мастер по ремонту парогенератора maestro

  14. DennisBob说道:

    ere pharm: ere pharm – erepharm.com

  15. Lloydlania说道:

    http://erepharm.com/# best ed pill ere pharm

  16. WilliamamoRi说道:

    укладка кафельной плитки в ванной цена укладка кафельной плитки

  17. CurtisTraup说道:

    buy rybelsus canada semaglutide buy rybelsus rybpharm

  18. DennisBob说道:

    buy gabapentin online: GabaPharm – cheapest Gabapentin GabaPharm

  19. Robertmep说道:

    https://kampharm.shop/# Kamagra Kam Pharm

  20. CurtisTraup说道:

    cheapest ed pills ere pharm best ed pill ere pharm best ed pill ere pharm

  21. DennisBob说道:

    lasix: furosemide furpharm.com – furosemide

  22. Lloydlania说道:

    https://erepharm.com/# ED meds online with insurance

  23. Тут можно преобрести сейф огнеупорный купить несгораемые сейфы

  24. Тут можно преобрести шкаф оружейный купить купить сейф для охотничьего оружия

  25. CurtisTraup说道:

    rybpharm buy rybelsus online usa buy rybelsus canada

  26. DennisBob说道:

    furosemide furpharm.com: cheapest lasix – cheapest lasix

  27. CurtisTraup说道:

    lasix furosemide furpharm.com furosemide

  28. Тут можно преобрести сейф оружейный оружейный сейф цена

  29. Lloydlania说道:

    http://erepharm.com/# erepharm pills

  30. Robertmep说道:

    http://gabapharm.com/# buy gabapentin

  31. DennisBob说道:

    lasix: buy lasix fur pharm – cheapest lasix

  32. Тут можно преобрести сейф несгораемый огнестойкие сейфы цена

  33. Robertmep说道:

    https://furpharm.com/# cheapest lasix

  34. CurtisTraup说道:

    gabapentin GabaPharm gabapentin gabapentin

  35. Lloydlania说道:

    https://kampharm.shop/# cheapest Kamagra Kam Pharm

  36. DennisBob说道:

    buy kamagra oral jelly Kam Pharm: buy kamagra oral jelly Kam Pharm – Kam Pharm

  37. Lloydlania说道:

    http://gabapharm.com/# gabapentin GabaPharm

  38. DennisBob说道:

    buy kamagra oral jelly Kam Pharm: Kamagra Kam Pharm – kam pharm shop

  39. Сервисный центр предлагает качественый ремонт кондиционера aeronik мастер по ремонту кондиционера aeronik

  40. Тут можно преобрести купить в москве оружейный сейф купить сейф под карабин

  41. profi teh remont说道:

    Сервисный центр предлагает ремонт монитора hp в москве ремонт монитора hp в москве

  42. Тут можно преобрести оружейный сейф купить в москве сейф для сайги 12

  43. Dereknef说道:

    casino siteleri win: Casino Siteleri – Deneme Bonusu Veren Siteler

  44. LarryBow说道:

    ultrabet bonus ultrabet yeni giris 1125 ultrabet yeni giris 1125

  45. ClydeTal说道:

    matadorbet: matadorbet giris – matadorbet giris

  46. CarrollWip说道:

    deneme bonusu veren siteler betturkey https://denemebonusuverensiteler.top/# deneme bonusu veren siteler betturkey

  47. Dereknef说道:

    denemebonusuverensiteler.top: deneme bonusu veren yeni siteler – deneme bonusu veren siteler mycbet.com

发表回复

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