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上也相似)
通过git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
clone源码到本地,当然也可用sourcetree等工具拉取下来
拉取下来后这就是里面的目录文件结构
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命令会无效,可忽略此步骤
./init-android.sh
找到init-android.sh
所在目录下执行此命令(一般是在项目根目录),根据命令行的内容,推测是在拉取FFMPEG各个CPU平台下的源码。下图是已经拉取完,执行上面命令后的结果
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
./compile-ffmpeg.sh clean
此命令用来清除上一次编译后生成的文件,执行结果如下,因为清除的文件较多,这里只截取了一部分
./compile-ffmpeg.sh all
用来编译生成FFMPEG所有平台的库,如果需要指定只编译某一个平台,可把all
改成armv7a
,x86
等平台。生成的文件都会在android/contrib
下面的build目录里,这里依然只截取一部分图,由于生成的文件较多,这一步会稍微比较久
注意:太高的NDK版本可能会生成失败,参考此issue:https://github.com/Bilibili/ijkplayer/issues/3840
编译完了之后,build目录下生成的文件
cd ..
./compile-ijk.sh all
切换回上一级目录,即回到ijkplayer-android/android
,然后执行编译。这里的all
同上面,也可改成自己想要编译的平台。
执行完了之后,在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
上面编译的是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"
然后在上面第二步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头文件:
把自己编译好的项目放入项目里后,遇到如下问题:
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的支持