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

/ 2,477评论 / 20214阅读 / 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. HaroldDon说道:

    Ozempic without insurance: Ozempic without insurance – ozempic generic

  3. BarryPow说道:

    https://ozempic.art/# ozempic online

  4. BarryPow说道:

    https://ozempic.art/# buy ozempic pills online

  5. Jeremycot说道:

    ozempic online Ozempic without insurance buy ozempic pills online

  6. Frankloole说道:

    https://rybelsus.shop/# rybelsus coupon

  7. Ramonfrive说道:

    ozempic cost: buy ozempic – buy ozempic pills online

  8. HaroldDon说道:

    rybelsus pill: rybelsus pill – buy semaglutide online

  9. Ramonfrive说道:

    buy ozempic: buy cheap ozempic – ozempic

  10. Frankloole说道:

    https://rybelsus.shop/# buy semaglutide pills

  11. HaroldDon说道:

    buy cheap ozempic: ozempic – ozempic

  12. BarryPow说道:

    http://rybelsus.shop/# cheapest rybelsus pills

  13. BarryPow说道:

    https://ozempic.art/# ozempic generic

  14. Jeremycot说道:

    Ozempic without insurance ozempic coupon buy ozempic

  15. Сервисный центр предлагает качественый ремонт экшен камеры xplore качественый ремонт экшен камер xplore

  16. HaroldDon说道:

    ozempic online: ozempic coupon – ozempic

  17. Профессиональный сервисный центр по ремонту серверов в Москве.
    Мы предлагаем: вызвать мастера по ремонту серверов
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  18. Frankloole说道:

    http://rybelsus.shop/# buy semaglutide pills

  19. HaroldDon说道:

    rybelsus cost: semaglutide online – semaglutide online

  20. Ramonfrive说道:

    rybelsus pill: buy semaglutide online – buy semaglutide online

  21. Ramonfrive说道:

    ozempic cost: ozempic coupon – buy ozempic

  22. Профессиональный сервисный центр по ремонту бытовой техники с выездом на дом.
    Мы предлагаем:сервисные центры в уфе
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  23. Профессиональный сервисный центр по ремонту серверов в Москве.
    Мы предлагаем: ремонт компьютеров серверов
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  24. HeathGlact说道:

    Viagra 100mg prix: Viagra generique en pharmacie – Viagra pas cher livraison rapide france

  25. Stephenmig说道:

    http://vgrsansordonnance.com/# Viagra sans ordonnance livraison 24h

  26. HeathGlact说道:

    pharmacie en ligne fiable: cialis prix – pharmacie en ligne pas cher

  27. CharlesCah说道:

    Viagra homme sans ordonnance belgique Acheter du Viagra sans ordonnance Viagra homme prix en pharmacie sans ordonnance

  28. CharlesCah说道:

    SildГ©nafil 100 mg prix en pharmacie en France viagra en ligne Viagra vente libre pays

  29. Stephenmig说道:

    https://pharmaciepascher.pro/# vente de mГ©dicament en ligne

  30. CharlesCah说道:

    Viagra sans ordonnance livraison 24h Viagra sans ordonnance 24h Viagra en france livraison rapide

  31. Stephenmig说道:

    https://clssansordonnance.icu/# Achat mГ©dicament en ligne fiable

  32. CharlesCah说道:

    acheter mГ©dicament en ligne sans ordonnance cialis generique pharmacie en ligne france pas cher

  33. Сервисный центр предлагает качественый ремонт стиральных машин aeg ремонт стиральных машин aeg недорого

  34. Профессиональный сервисный центр по ремонту плоттеров в Москве.
    Мы предлагаем: обслуживание плоттеров
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  35. What is a good dental health? My website: prodentim reviews

  36. HeathGlact说道:

    pharmacie en ligne pas cher: cialis prix – Pharmacie sans ordonnance

  37. Stephenmig说道:

    https://vgrsansordonnance.com/# Viagra pas cher livraison rapide france

  38. HeathGlact说道:

    Pharmacie sans ordonnance: Cialis generique prix – Pharmacie sans ordonnance

  39. HeathGlact说道:

    Viagra pas cher livraison rapide france: Meilleur Viagra sans ordonnance 24h – Viagra pas cher livraison rapide france

  40. Профессиональный сервисный центр по ремонту плоттеров в Москве.
    Мы предлагаем: ремонт плоттеров
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  41. 먹튀검증说道:

    Thank you for the good writeup It in fact was a amusement account it Look advanced to far added agreeable from you However how could we communicate

  42. HeathGlact说道:

    pharmacie en ligne pas cher: cialis sans ordonnance – Achat mГ©dicament en ligne fiable

  43. CharlesCah说道:

    vente de mГ©dicament en ligne pharmacie en ligne pas cher pharmacie en ligne france pas cher

  44. CharlesCah说道:

    pharmacie en ligne pharmacie en ligne sans ordonnance pharmacie en ligne avec ordonnance

  45. HeathGlact说道:

    pharmacie en ligne france fiable: Cialis generique prix – pharmacie en ligne france fiable

  46. Профессиональный сервисный центр по ремонту принтеров в Москве.
    Мы предлагаем: ремонт принтеров в москве
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  47. CharlesCah说道:

    Viagra vente libre pays viagra en ligne Viagra gГ©nГ©rique pas cher livraison rapide

  48. CharlesCah说道:

    pharmacie en ligne france livraison internationale Cialis sans ordonnance 24h pharmacie en ligne sans ordonnance

  49. HeathGlact说道:

    Viagra prix pharmacie paris: Viagra generique en pharmacie – Meilleur Viagra sans ordonnance 24h

  50. HeathGlact说道:

    Pharmacie sans ordonnance: cialis generique – pharmacie en ligne livraison europe

发表回复

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