众所周知ijkplayer是基于FFmpeg开发的一款开源播放器,既然是开源,我们直接在项目中引用不就完事了么,为什么需要自己编译?
这是因为官方默认的编译做了一些功能上的阉割,比如不支持avi格式播放,不支持https播放,不支持rtsp协议等。
一旦我们的项目中需要用到这些功能就需要我们修改ijkplayer,从新编译。
编译环境
笔者的编译环境是MacOS系统以及ijkplayer官方推荐的NDKr10e。
另外按照官方要求,需要配置好SDK和NDK的环境变量:
在你的~/.bash_profile 或者 ~/.profile 文件中配置好SDK和NDK的路径
export ANDROID_SDK=<your sdk path>
export ANDROID_NDK=<your ndk path>
# 设置完成后需要运行
source ~/.bash_profile或者source ~/.profile
ijnplayer编译
1、 ijnplayer的默认引入
正常情况下我们引入ijkplayer一般要加入两个依赖:
# required
allprojects {
repositories {
jcenter()
}
}
dependencies {
# java 层播放器API
compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
# so库,其实这是一个空的项目,里面没有任何代码
# 如果我们需要自己编译ijkplayer的话就不需要这个依赖了,将我们编译出来的so引入就好
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
}
其中compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
这个依赖没有任何代码,只有一些so库,
如果我们需要自己编译ijkplayer的话就不需要这个依赖了,将我们编译出来的so引入替代就好。或许这就是架构扩展的魅力所在吧。
2、 Android平台的编译
官方的编译指引:
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
cd ijkplayer-android
git checkout -B latest k0.8.8
# 这里做事情大概就是使用git去下载特定版本ffmpeg、libyuv、soundtouch这些外部依赖
./init-android.sh
cd android/contrib
# 清除
./compile-ffmpeg.sh clean
# 编译ffmpeg
./compile-ffmpeg.sh all
cd ..
# 编译生成so
./compile-ijk.sh all
我们按照官方的指引,如果环境没有文件,很容易就能编译出你想要的so库文件。
编译完成之后会生成三个so库,分别是libijkffmpeg.so
和libijkplayer.so
以及 libijksdl.so
。
所在目录是ijkplayer/ijkplayer-armv7a/src/main/libs
。
这里要说明一下编译时传递的all
参数表示编译全平台的的so,如果你需要单独某个平台的,比如说你仅仅需要armv7a
平台的架构,
那么将all
参数修改为armv7a
即可。
使用git clone下载好源码之后,我们cd到config
目录,这个目录主要是编译ffmpeg使用的配置文件,下面有四个文件:
module-default.sh 这个配置文件包含了更多的编解码器/格式;
module-lite-hevc.sh 包含较少的编解码器/格式(包括hevc)
module-lite.sh 包含较少的编解码器/格式(默认情况)
# 可以通过上面的三个配置文件适当地对ffmpeg做一些裁剪
module.sh 这是一个软链接,默认指向module-lite.sh
其中对于module.sh
这个软链接默认是指向module-lite.sh
,如果我们要想改变它的指向,可以在编译之前指向一下命令:
# rm删除
rm module.sh
# 从新指向 ,比如指向module-lite-hevc.sh
ln -s module-lite-hevc.sh module.sh
编译遇到的问题
笔者在编译的过程中遇到一个问题,就是报ANDROID_NDK路径找不到,笔者明明以及配置好了环境变量,也使用了source
命令刷新了环境变量,但是无论如何就是找不到。经过一段猛如虎的操作之后才发现,刷新了环境变量之后,需要把你的命令行窗口关闭,然后重新打开才行,如果你的窗口是在配置环境变量之前打开的,那么你即时刷新了环境变量,依然是找不到的。
目录说明
打开ijkplayer,可看到其主要目录结构如下:
android - android平台上的上层接口封装以及平台相关方法 (包括安卓内置的MediaPlayer和谷歌的ExoPlayer以及基于ffplay的IjkMediaPlayer)
config - 编译ffmpeg使用的配置文件
extra - 存放编译ijkplayer所需的依赖源文件, 如ffmpeg、openssl等
ijkmedia - 核心代码
..ijkj4a - android平台下使用,用来实现c代码调用java层代码,这个文件夹是通过bilibili的另一个开源项目jni4android自动生成的。
..ijkplayer - 播放器数据下载及解码相关
..ijksdl - 音视频数据渲染相关
ios - iOS平台上的上层接口封装以及平台相关方法
tools - 初始化项目工程脚本
结语
对于ijkplayer的编译和文件结构今天就先了解到这里。后面会针对IjkMediaPlayer
的源码和架构做些说明,有兴趣的童鞋扫码关注公众号。
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/20057.html