ijkplayer-android编译 兼容多视频格式

目前所在公司是做教育少儿类视频播放的,起因是测试人员测试应用时发现的bug。(有的是视频播放有画面没有声音,有的是有声音没有画面)

查找问题原因

先看了一下播放正常的视频的编码信息

视频编码格式h264   音频编码格式aac

ijkplayer-android编译 兼容多视频格式_第1张图片

然后是有画面没声音的视频编码格式

视频编码h264   音频编码格式(mpeg audio layer 1/2)看不懂什么意思,百度了一下说是mp2格式

ijkplayer-android编译 兼容多视频格式_第2张图片

然后是有声音没画面的视频编码格式

视频编码格式mpeg4   音频编码格式aac

ijkplayer-android编译 兼容多视频格式_第3张图片

最后总结出来是目前客户端的播放器解码不了mpeg4的视频编码和mp2的音频编码

 

用的播放器框架是ijkplayer  然后就去https://github.com/Bilibili/ijkplayer的issue里找答案发现很多人遇到了这个问题,最终还是想通过编译定制化so的方式解决。

践行解决方案

按照官方文档编译android版so的流程

  1. git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
  2. cd ijkplayer-android
  3. git checkout -B latest k0.8.8
  4. ./init-android.sh
  5. 修改config/module.sh添加你要支持的编码格式
  6. cd android/contrib
  7. ./compile-ffmpeg.sh clean
  8. ./compile-ffmpeg.sh all
  9. cd ..
  10. ./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"

ijkplayer-android编译 兼容多视频格式_第4张图片

修改完成进入到android/contrib后 执行第7 & 8步操作编译ffmpeg 官方文档默认是编译所有架构的   这里我只选择了armv7a

./compile-ffmpeg.sh armv7a

编译完这个之后返回上一级继续执行第10步操作 ./compile-ijk.sh all

同级目录有一个ijkplayer目录,这是一个标准到android项目,编译完的so库会输出到ijkplayer/ijkplayer-armv7a/src/main/libs

ijkplayer-android编译 兼容多视频格式_第5张图片

等这个编译完成之后整个编译就算完成了。

集成到现有项目

编译完了之后要手动加到工程项目里,但之前的项目是直接compile了两个官方的依赖

compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'

compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'

有两种集成方式

  1. 现在可以直接将ijkplayer项目里的ijkplayer-java和ijkplayer-armv7a当作module引入到你到项目替换之前的依赖项
  2. 只将原先的compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'去除,将编译完的so库放到自己项目的src/main/libs里面然后在build.gradle的android下添加
    sourceSets {
            main {
                jniLibs.srcDirs 'src/main/libs'
            }
     }

ijkplayer-android编译 兼容多视频格式_第6张图片

如果以后还有不支持的编码格式,还是在module.sh增加相应编码格式从新编译so即可。

至此问题解决完毕

 

你可能感兴趣的:(android)