一、Ijkpkayer
Ijkplayer是B站开源的播放器项目,虽然已经有三年没有更新了,但是作为一个比较经典的视屏播放器项目还是很有必要学习的。
如果对Ijkplayer还不熟悉可以看:
IjkPlayer【1】 Demo Android的最简单实现
IjkPlayer【2】 API 查询
二、项目结构
以下是IjkPlayer的项目结构,依赖关系从下到上很很明显,另外ffmpeg作为视屏编解码的核心在途中是有意超出了一部分到libijkplayer.so的,因为在ijksdl和ijkplayer中都引用到了ffmpeg。
ffmpeg、libyuv、soundtouch 是三方开源库
libijkj4a、android-ndk-prof、libijksdl、libijkplayer 是Ijkplayer项目,除了android-ndk-prof,其他三个源码都在项目中的ijkmedia文件夹中。
三、项目目录
|ijkplayer
|----android //Ijkplayer Android 项目源码
|----config //ffmpeg的配置脚本
|----|----module.sh //ffmpeg 当前配置脚本,可用以下三个模板替换当前脚本
|----|----module-default.sh //默认配置
|----|----module-lite.sh //最小化配置
|----|----module-lite-hevc.sh //基于最小化配置添加hevc功能配置
|----doc //介绍说明
|----extra //三方依赖库保存的文件夹
|----|----init-extra.sh // 引用本地存在的库
|----ijkmedia //IjkPlayer Native部分源码
|----ijkprof
|----ios //IjkPlayer IOS 部分源码
|----tools //git操作项目的工具脚本
|----|----pull-repo-base.sh
|----|----pull-repo-ref.sh
|----|----setup-as-commiter.sh
|----|----sync-mirrors.sh
|----init-android.sh //Android初始化脚本
|----init-android-exo.sh //被compile-ijk.sh调用
|----init-android-j4a.sh //被compile-ijk.sh调用
|----init-android-libsoxr.sh //被compile-ijk.sh调用
|----init-android-libyuv.sh //被init脚本调用
|----init-android-openssl.sh //添加openssl需要在编译ffmpeg之前执行openssl的init和compile
|----init-android-prof.sh //被compile-ijk.sh调用
|----init-android-soundtouch.sh //被compile-ijk.sh调用
|----init-config.sh //被init脚本调用
|----init-ios.sh //ios初始化脚本
|----init-ios-openssl.sh //添加openssl需要在编译ffmpeg之前执行openssl的init和compile
|----version.sh //查看版本的脚本
四、项目的构建流程分析
1)init
不管是Android还是IOS都要分别先执行init-android.sh和init-ios.sh。init脚本会按顺序执行以下任务:
1、 使用git拉ffmpeg取源码到extra文件夹中,并在Android或IOS项目中创建不同CPU架构的分支。
2、检测ffmpeg在config文件夹中的配置文件。
3、下载libyuv源码
4、 下载soundtouch源码
2)Compile-ffmpeg
这一步主要是将第一步中下载好的源码进行编译。ffmpeg编译的配置文件是config\module.sh生成的。
分别在Android和IOS中执行对应的compile-ffmpeg.sh脚本即可,脚本会将ffmpeg的动态链接库合并成为一个动态链接库。
如果想要ffmpeg添加openssl需要先编译openssl,执行init-android-openssl.sh下载OpenSSL,执行compile-openssl.sh编译openssl,在编译ffmpeg时compile-ffmpeg.sh脚本会根据openssl是否存在自动添加无需其他配置。
3)compile-ijk
编译ijkmedia源码,Android使用android\compile-ijk.sh脚本进行编译,编译完ijk后就可以开发项目开始开发了。