在Mac OS上编译ijkplayer,并加入MPEG-4解码支持

compile 'tv.danmaku.ijk.media:ijkplayer-java:0.7.8.1'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.7.8.1'

需求:项目中gradle里引入的ijkplayer默认可以支持播放avcodec编码的mp4格式的视频,但是不支持播放mp4格式MPEG-4编码的视频(现象为视频出现黑屏,可听到声音,说明音频能被解码)

解决办法:通过修改配置,并重新编码出SO,以达到支持播放MPEG-4编码的视频

编译环境:(在Linux上也相似)

  • macOS 10.12.4
  • Android
  • NDK 13.1
  • Android Studio 2.2
  • Gradle 2.14.1

1.下载Git上的源码

通过git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-androidclone源码到本地,当然也可用sourcetree等工具拉取下来

在Mac OS上编译ijkplayer,并加入MPEG-4解码支持_第1张图片

拉取下来后这就是里面的目录文件结构

2.配置

1.配置NDK:

先进入自己的用户下面,然后再更改配置文件,一般是.bash_profile或者.profile。这里以.bash_profile为例子说明

cd ~
vi .bash_profile

进入到vi编译模式后,再把export ANDROID_NDK=此行写入。(vi用法请自行查阅)
然后使用source ~/.bash_profile命令让其生效

注:对命令不熟悉可以在Finder中,先按住shif + command +
.
显示隐藏文件,接着进入到自己用户目录,找到隐藏的.bash_profile,再文本编辑打开,来配置上述环境

2.配置FFMPEG的需要支持的视频格式等

在clone下来项目里的config目录里提供了三个配置文件。这里先以配置文件module-default.sh作为例子编译一次

cd config
rm module.sh    //如果已经存在,必须先移除,否则不能生成新的
ln -s module-default.sh module.sh   //生成一个module.sh的连接指向module-default.sh

3.创建分支

git checkout -B latest k0.8.0

创建并切换到一个最新的分支latest来作为我们自己编译的分支,不直接在master上修改。我这里是在0.8.0上的基础上重新编译的,版本号可在ijkplayer-android目录下的version.sh找到

注意:如果是直接下载压缩包下来的,这样的话不是一个Git仓库,Git命令会无效,可忽略此步骤

3.下载并编译FFMPEG

./init-android.sh

找到init-android.sh所在目录下执行此命令(一般是在项目根目录),根据命令行的内容,推测是在拉取FFMPEG各个CPU平台下的源码。下图是已经拉取完,执行上面命令后的结果

在Mac OS上编译ijkplayer,并加入MPEG-4解码支持_第2张图片

cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

./compile-ffmpeg.sh clean此命令用来清除上一次编译后生成的文件,执行结果如下,因为清除的文件较多,这里只截取了一部分

在Mac OS上编译ijkplayer,并加入MPEG-4解码支持_第3张图片

./compile-ffmpeg.sh all用来编译生成FFMPEG所有平台的库,如果需要指定只编译某一个平台,可把all改成armv7ax86等平台。生成的文件都会在android/contrib下面的build目录里,这里依然只截取一部分图,由于生成的文件较多,这一步会稍微比较久

注意:太高的NDK版本可能会生成失败,参考此issue:https://github.com/Bilibili/ijkplayer/issues/3840

在Mac OS上编译ijkplayer,并加入MPEG-4解码支持_第4张图片

编译完了之后,build目录下生成的文件

在Mac OS上编译ijkplayer,并加入MPEG-4解码支持_第5张图片

4.编译ijkplayer

cd ..
./compile-ijk.sh all

切换回上一级目录,即回到ijkplayer-android/android,然后执行编译。这里的all同上面,也可改成自己想要编译的平台。

在Mac OS上编译ijkplayer,并加入MPEG-4解码支持_第6张图片

执行完了之后,在Demo里面的各个module下的libs就会生成对应的so了,如armv7a的module下的路径ijkplayer-android/android/ijkplayer/ijkplayer-armv7a/src/main/libs

想要查看Demo,只需把ijkplayer-android/android/ijkplayer导入进去Android Studio里面

注意:如果编译的时候出现./libavutil/timer.h:38:31: fatal error: linux/perf_event.h: No such file or directory等头文件找不到的话,请参考:https://github.com/Bilibili/ijkplayer/issues/4043

5.定制自己需要的解码器

上面编译的是module-default.sh配置的SO,libijkffmepg.so大约有7MB左右,实际上对于大多数手机端上的视频来说,我们并不需要用到那么多解码器,这无疑增大了包的体积。

再回到我们一开始的需求,我们只需要在原来compile进来的 so基础上增加对MEPG-4视频编码的支持就行了。

打开config目录下的module-lite.sh,在#./configure --list-decoders末尾加入下面这行

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mpeg4"

在Mac OS上编译ijkplayer,并加入MPEG-4解码支持_第7张图片

然后在上面第二步ln -s module-default.sh module.sh创建module.sh时,修改成下面,其他不变

ln -s module-lite.sh module.sh

最后生成的libijkffmepg.so大概2MB,比compile导入的so大概多了300~400KB。

如果想要增加更多的格式或是控制so的体积,只保留自己需要的解码,则可在配置里disable那个解码器

一些支持的文件格式或者视频流可以参考FFmpeg里面的avcodec.h头文件:

在Mac OS上编译ijkplayer,并加入MPEG-4解码支持_第8张图片

把自己编译好的项目放入项目里后,遇到如下问题:

java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/com.p1.mobile.putong-1/lib/arm/libijksdl.so"

1.保证ijkplayer-java这个库跟so的库版本一致

2.在proguard-rules.pro加入-keep class tv.danmaku.** {*;}不被混淆

参考资料:

1.https://github.com/Bilibili/ijkplayer

2.ijkplayer 编译so库过程

3.iOS使用IJKPlayer播放编码mpeg视频无画面

4.IJKPlayer问题集锦之不定时更新

5.ijkplayer开启rtsp与MJPEG的支持

你可能感兴趣的:(视频)