東川印記

一本東川,笑看爭龍斗虎;寰茫兦者,度橫佰昧人生。

exoplayer 通过 NDK 21 编译 FFmpeg 4.2 extensions

2021年4月6日星期二



老样子,资料杂乱老旧

1,下载exoplayer 源码

SENRSL:ExoPlayer senrsl$ git clone git@github.com:senRsl/ExoPlayer.git

2. 写编译脚本

SENRSL:ExoPlayer senrsl$ touch make_ffmpeg_21.sh

SENRSL:ExoPlayer senrsl$ cat make_ffmpeg_21.sh
#!/bin/bash

EXOPLAYER_ROOT="$(pwd)"
FFMPEG_EXT_PATH="${EXOPLAYER_ROOT}/extensions/ffmpeg/src/main"

# 1.配置看自己需求
COMMON_OPTIONS="
    --target-os=android
    --disable-static
    --enable-shared
    --disable-doc
    --disable-programs
    --disable-everything
    --disable-avdevice
    --disable-avformat
    --disable-swscale
    --disable-postproc
    --disable-avfilter
    --disable-symver
    --disable-avresample
    --enable-swresample
    --enable-avresample
    --enable-decoder=vorbis
    --enable-decoder=opus
    --enable-decoder=flac
    --enable-decoder=alac
    --enable-decoder=pcm_mulaw
    --enable-decoder=pcm_alaw
    --enable-decoder=mp3
    --enable-decoder=amrnb
    --enable-decoder=amrwb
    --enable-decoder=aac
    --enable-decoder=ac3
    --enable-decoder=eac3
    --enable-decoder=dca
    --enable-decoder=mlp
    --enable-decoder=truehd
    --extra-ldexeflags=-pie
    "&& \

# 2.NDK路径,记得修改
NDK_PATH="/Users/senrsl/android/sdkas/ndk/21.3.6528147"
# HOST_PLATFORM="linux-x86_64"
HOST_PLATFORM="darwin-x86_64"
TOOLCHAIN_PREFIX="${NDK_PATH}/toolchains/llvm/prebuilt/${HOST_PLATFORM}/bin"

# 3.FFMPEG路径,记得修改
cd "${FFMPEG_EXT_PATH}/jni" && \
git clone git://source.ffmpeg.org/ffmpeg && \
cd ffmpeg && \
git checkout release/4.2 && \
FFMPEG_PATH="$(pwd)"


./configure \
    --libdir=android-libs/armeabi-v7a \
    --arch=arm \
    --cpu=armv7-a \
    --cross-prefix="${TOOLCHAIN_PREFIX}/armv7a-linux-androideabi16-" \
    --nm="${TOOLCHAIN_PREFIX}/arm-linux-androideabi-nm" \
    --strip="${TOOLCHAIN_PREFIX}/arm-linux-androideabi-strip" \
    --extra-cflags="-march=armv7-a -mfloat-abi=softfp" \
    --extra-ldflags="-Wl,--fix-cortex-a8" \
    ${COMMON_OPTIONS}
make -j4
make install-libs
make clean
./configure \
    --libdir=android-libs/arm64-v8a \
    --arch=aarch64 \
    --cpu=armv8-a \
    --cross-prefix="${TOOLCHAIN_PREFIX}/aarch64-linux-android21-" \
    --nm="${TOOLCHAIN_PREFIX}/aarch64-linux-android-nm" \
    --strip="${TOOLCHAIN_PREFIX}/aarch64-linux-android-strip" \
    ${COMMON_OPTIONS}
make -j4
make install-libs
make clean
./configure \
    --libdir=android-libs/x86 \
    --arch=x86 \
    --cpu=i686 \
    --cross-prefix="${TOOLCHAIN_PREFIX}/i686-linux-android16-" \
    --nm="${TOOLCHAIN_PREFIX}/i686-linux-android-nm" \
    --strip="${TOOLCHAIN_PREFIX}/i686-linux-android-strip" \
    --disable-asm \
    ${COMMON_OPTIONS}
make -j4
make install-libs
make clean
./configure \
    --libdir=android-libs/x86_64 \
    --arch=x86_64 \
    --cpu=x86_64 \
    --cross-prefix="${TOOLCHAIN_PREFIX}/x86_64-linux-android21-" \
    --nm="${TOOLCHAIN_PREFIX}/x86_64-linux-android-nm" \
    --strip="${TOOLCHAIN_PREFIX}/x86_64-linux-android-strip" \
    --disable-asm \
    ${COMMON_OPTIONS}
make -j4
make install-libs
make clean
SENRSL:ExoPlayer senrsl$


3. 编译生成

SENRSL:ExoPlayer senrsl$ sh make_ffmpeg_21.sh

SENRSL:ExoPlayer senrsl$ tree extensions/ffmpeg/src/main/jni/ffmpeg/android-libs/
extensions/ffmpeg/src/main/jni/ffmpeg/android-libs/
├── arm64-v8a
│   ├── libavcodec.so
│   ├── libavresample.so
│   ├── libavutil.so
│   └── libswresample.so
├── armeabi-v7a
│   ├── libavcodec.so
│   ├── libavresample.so
│   ├── libavutil.so
│   └── libswresample.so
├── x86
│   ├── libavcodec.so
│   ├── libavresample.so
│   ├── libavutil.so
│   └── libswresample.so
└── x86_64
    ├── libavcodec.so
    ├── libavresample.so
    ├── libavutil.so
    └── libswresample.so

4 directories, 16 files
SENRSL:ExoPlayer senrsl$

编完了才发现,这个文件 exoplayer里直接就有现成的。。。。

4,使用

复制extensions/ffmpeg/src/main/java/下的几个java文件,和编译生成的so....

修改

//音轨选择器 // TrackSelection.Factory trackSelectionFactory = new AdaptiveTrackSelection.Factory(); // DefaultTrackSelector trackSelector = new DefaultTrackSelector(this, trackSelectionFactory); ExoTrackSelection.Factory trackSelectionFactory = new AdaptiveTrackSelection.Factory(); DefaultTrackSelector defaultTrackSelector = new DefaultTrackSelector(getApplicationContext(), trackSelectionFactory); //渲染 DefaultRenderersFactory defaultRenderersFactory = new DefaultRenderersFactory(getApplicationContext()); defaultRenderersFactory.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER); // defaultRenderersFactory.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);


player = new SimpleExoPlayer.Builder(this, defaultRenderersFactory) .setLoadControl(loadControl) .setTrackSelector(defaultTrackSelector) // .setTrackSelector(trackSelector) .build();

运行即可。。。。

按照文档所说,播放视频时输出 Loaded FFmpeg 大概这行字的日志就说明成功了。。。。


问题:

exoplayer ffmpeg C.FormatSupport

    修改 exoplayer version 为2.13.2。。。。

Failed to resolve: core-1.3.0

    google()移动到第一位

 TrackSelection.Factory trackSelectionFactory = new AdaptiveTrackSelection.Factory();
                      ^
  符号:   类 Factory
  位置: 接口 TrackSelection

    哪里报错注释哪里,exoplayer版本一变动,好多api没了。。。。


最终试了下,应该是可以了,以前不能播的 AC-3、flac都能播了。。。。


--
senRsl
2021年04月02日11:29:10

没有评论 :

发表评论