一、引言:
ijkplayer是一款对FFmpeg封装非常好的第三方开源播放器,遗憾的是,ijkplayer2.0似乎不开源,并且1.0版本更新也基本停止了,很多公司都会采用ijkplayer作为其播放应用的内核,这款集合软硬件编解码功能的播放器确实备受青睐,从这篇文章开始,将对ijkplayer播放器做一个剖析,希望对大家理解ijkplayer有一定的帮助,当然,不对的地方还望指正。
二、环境搭建及编译:
1.环境搭建:
ijkplayer的GitHub
地址如下:
通过阅读工程的readme
可以帮我们快速搭建ijkplayer的环境,想要在我们自己的工程中使用ijkplayer的话,需要java层的依赖和底层的库,前者直接在gradle
中添加如下依赖:
dependencies {
# required, enough for most devices.
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
# Other ABIs: optional
compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'
# ExoPlayer as IMediaPlayer: optional, experimental
compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'
}
想要正确编译出ijkplayer的jni库需要NDK和SDK,NDK的工具包可在Android的官网下载。从我实测的经验来看,r14e~r10e
的版本是可以编译过的,太新或者太久的版本都不行,建议大家下载这中间的版本,NDK和SDK的编译工具包下载完之后,根据自己的服务器或者虚拟机环境将包含NDK和SDK路径的环境变量导入如下:
export ANDROID_NDK=/home/xxx/android-ndk-r10e
export PATH=$PATH:ANDROID_NDK
export ANDROID_SDK=/home/xxx/android-sdk-linux
export PATH=${PATH}:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools
2.编译:
JNI库的编译,我们依次执行如下指令即可:
./init-android.sh
cd android/contrib
./compile_ffmpeg.sh clean
./compile_ffmpeg.sh all (默认是只编译armv7) armv5 armv7a arm64 x86 x86_64
cd ..
./compile_ijk.sh all
这里需要注意如下问题,第一步是通过ijkplayer的脚本去下载FFmpeg的源码,一共有5个架构的源码,所以这里会耽搁比较久的时间,接下来就是编译对应架构的FFmpeg库,脚本后面跟all
是编译所有架构,当然,也可以选择编译自己已知平台的架构,常用的架构有armv7a
和arm64
。最后一步就是去编译ijkplayer的库了,也是可以选择自己需要的架构,当编译完成后,将生成如下三个动态库:libijkffmpeg.so
libijkplayer.so
libijksdl.so
三、运行demo:
通过Android studio打开ijkplayer源码中的工程ijkplayer-example
,可以通过主动创建lib文件夹将上面生成的三个库打包到里面,也可以通过adb推入到单板的system/lib
下面,之后,将demo编译完后安装到自己的平台中,即可以播放码流了。需要注意的是,如果播放测试码流闪退,极有可能是三个库的缺失导致的。
四、源码路径介绍:
ijkplayer的源码路径有点复杂,很多人不知道调试的时候,应该修改哪些地方的,这里着重说一下。
进入根目录,我们着重关注下面一个路径:
android/ios
分别对应不同的OS平台;
config
文件夹下面是几个脚本,用于配置我们的ijkplayer及FFmpeg的,如果项目中有必要裁剪库的,请关注这里;
extra
文件下面是ijkplayer使用的第三方软件,请注意,修改这里面的FFmpeg源码并没有效果;
ijkmedia
这里面就是ijkplayer的源码了,包括ijkplayer的jni及sdl源码的实现,这个文件夹非常重要;
因为我使用的是Android平台, 接下来进入android
目录:
contrib
目录下面就是各个架构的FFmpeg的源码了,修改了这里的源码,推入libijkffmpeg.so
才会有效果;
ijkplayer
目录是java工程的所在,ijkplayer-example
就是在这个目录下;
五、总结:
这一篇比较轻松,简单介绍了下ijkplayer的编译及使用,下一篇将开始从官方demo开始,看ijkplayer是如何调入到jni库中去的。