赞
踩
有时候Exoplayer自带的解码器不支持一些特殊的格式或者编码,此时我们可以通过给Exoplayer添加Ffmpeg扩展实现软解来支持这些编码。
cd "Exoplayer工程目录"
FFMPEG_MODULE_PATH="$(pwd)/extensions/ffmpeg/src/main"
NDK_PATH="NDK的安装目录"
HOST_PLATFORM="linux-x86_64"
cd "Ffmpeg工程目录"
FFMPEG_PATH="$(pwd)"
ENABLED_DECODERS=(mp3 aac ac3)
有关可用解码器的详细信息以及它们支持的格式,请参阅支持的格式页面。
cd "${FFMPEG_MODULE_PATH}/jni" && \
ln -s "$FFMPEG_PATH" ffmpeg
如果报错file exists
可以使用如下命令:
cd "${FFMPEG_MODULE_PATH}/jni" && \
ln -sf "$FFMPEG_PATH" ffmpeg
cd "${FFMPEG_MODULE_PATH}/jni" && \
./build_ffmpeg.sh \
"${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ENABLED_DECODERS[@]}"
如果您需要为不同的体系结构构建脚本或者配置ffmpeg编译参数,则可以编辑构建脚本文件:build_ffmpeg.sh脚本,默认支持
armeabi-v7a,arm64-v8a,x86,x86_64
ExoPlayer/extensions/ffmpeg/src/main/jni/ffmpeg
目录下面生成了android-libs
目录。在完成上述步骤以后,我们编译好的源码并不能直接在Android系统上使用,因为还未进行过交叉编译。
cd "Exoplayer工程目录"
./gradlew extension-ffmpeg:assembleRelease
/ExoPlayer/extensions/ffmpeg/buildout/output/aar
使用 gradle 将 aar 库导入到项目中。
implementation files('libs/extension-ffmpeg-release.aar')
class FfmpegRenderersFactory extends DefaultRenderersFactory {
public FfmpegRenderersFactory(Context context) {
super(context);
setExtensionRendererMode(EXTENSION_RENDERER_MODE_PREFER);
}
@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());
super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, audioSink, eventHandler, eventListener, out);
}
}
ExoPlayer.Builder(MyApp.instance.applicationContext,new FfmpegRenderersFactory())
val url = ""
val mediaItem: MediaItem = MediaItem.fromUri(url)
player.setMediaItem(mediaItem)
player.prepare()
player.play()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。