ijkplayer-android编译 兼容多视频格式
目前所在公司是做教育少儿类视频播放的,起因是测试人员测试应用时发现的bug。(有的是视频播放有画面没有声音,有的是有声音没有画面)
查找问题原因
先看了一下播放正常的视频的编码信息
视频编码格式h264 音频编码格式aac
然后是有画面没声音的视频编码格式
视频编码h264 音频编码格式(mpeg audio layer 1/2)看不懂什么意思,百度了一下说是mp2格式
然后是有声音没画面的视频编码格式
视频编码格式mpeg4 音频编码格式aac
最后总结出来是目前客户端的播放器解码不了mpeg4的视频编码和mp2的音频编码
用的播放器框架是ijkplayer 然后就去https://github.com/Bilibili/ijkplayer的issue里找答案发现很多人遇到了这个问题,最终还是想通过编译定制化so的方式解决。
践行解决方案
按照官方文档编译android版so的流程
- git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
- cd ijkplayer-android
- git checkout -B latest k0.8.8
- ./init-android.sh
- 修改config/module.sh添加你要支持的编码格式
- cd android/contrib
- ./compile-ffmpeg.sh clean
- ./compile-ffmpeg.sh all
- cd ..
- ./compile-ijk.sh all
其它步骤命令都是死的 只有第五步是需要你自己添加的
module.sh默认是软连接的module-lite.sh 我编译出来的so差不多4m
在该文件中添加了三种解码格式
- export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mpeg4"
- export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mp2*"
- export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=ac3"
修改完成进入到android/contrib后 执行第7 & 8步操作编译ffmpeg 官方文档默认是编译所有架构的 这里我只选择了armv7a
./compile-ffmpeg.sh armv7a
编译完这个之后返回上一级继续执行第10步操作 ./compile-ijk.sh all
同级目录有一个ijkplayer目录,这是一个标准到android项目,编译完的so库会输出到ijkplayer/ijkplayer-armv7a/src/main/libs
等这个编译完成之后整个编译就算完成了。
集成到现有项目
编译完了之后要手动加到工程项目里,但之前的项目是直接compile了两个官方的依赖
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
有两种集成方式
- 现在可以直接将ijkplayer项目里的ijkplayer-java和ijkplayer-armv7a当作module引入到你到项目替换之前的依赖项
- 只将原先的compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'去除,将编译完的so库放到自己项目的src/main/libs里面然后在build.gradle的android下添加
sourceSets { main { jniLibs.srcDirs 'src/main/libs' } }
如果以后还有不支持的编码格式,还是在module.sh增加相应编码格式从新编译so即可。
至此问题解决完毕