ijkplayer编译实践(基于MacOS NDKr10e)

众所周知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.solibijkplayer.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

(0)

相关推荐

发表回复

登录后才能评论