ijkplayer 是 bilibili 开源的一款优秀的播放器, 基于 FFmpeg, 支持 iOS/Android, 点播/直播, 以及多种编码.官方并不直接提供 framework 框架包, 这样大家可以根据需要选择配置, 自己编译并打包.但这样也会让很多伙伴们编译懵逼,我就是其中一位。下面是我如何在 iOS 中集成ijkplayer的,仅供各位大佬参考:
一、 下载ijkplayer:
在任意一个地方新建一个文件夹, 假设为桌面, 文件夹名为ijkplayer:
# 进入到刚刚新建的文件夹内
cd ~/Desktop/ijkplayer/
# 获取ijkplayer源码
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios
# 进入源码目录
cd ijkplayer-ios
# 新建一个latest分支并切换分支 (目前为k0.8.8, 可以自行去GitHub查看最新版本号)
git checkout -B latest k0.8.8
二、 配置编解码器格式支持:
一般默认为最少支持, 如果足够你使用, 可以跳过这一步. 否则可以改为以下配置:
. module-default.sh 更多的编解码器/格式
. module-lite-hevc.sh 较少的编解码器/格式(包括hevc)
. module-lite.sh 较少的编解码器/格式(默认情况)
# 进入 config 目录
cd config
# 删除当前的 module.sh 文件
rm module.sh
# 可根据需要替换为`module-default.sh`, `module-lite-hevc.sh`, `module-lite.sh`
# 创建软链接 module.sh 指向 module-lite-hevc.sh
ln -s module-lite-hevc.sh module.sh
cd ..
cd ios
sh compile-ffmpeg.sh clean
三、获取 ffmpeg 并初始化 (这一步要是网络太差会非常的慢,我有两次编译了3个小时)
cd ..
./init-ios.sh
四、添加 https 支持
最后会生成支持 https 的静态文件 libcrypto.a 和 libssl.a, 如果不需要可以跳过这一步
# 获取 openssl 并初始化
./init-ios-openssl.sh
cd ios
# 在模块文件中添加一行配置 以启用 openssl 组件
echo 'export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-openssl"' >> ../config/module.sh
./compile-ffmpeg.sh clean
编译:
# 如果下一步提示错误`xcrun: error: SDK "iphoneos" cannot be located`, 请执行`sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/`, 再重新执行下一步
# 编译openssl, 如果不需要https可以跳过这一步
./compile-openssl.sh all
# 编译ffmpeg
./compile-ffmpeg.sh all
ps: 如果提示错误:
添加 openssl 相关包以支持 https (如果不使用 https, 可以跳过此步, 直接开始打包 framwork)
如果使用 https, 那么需要手动给 IJKMediaFramework 添加libcrypto.a和libssl.a文件, 默认不会添加
ps: 这两个依赖库的目录为: ijkplayer-ios/ios/build/universal/lib, 只有进行了上面跟 openssl 相关的操作, 才会在这个目录下有生成libcrypto.a和libssl.a
五、打开 IJKMediaPlayer 项目 (执行完上面的每一步后确认无误)
open IJKMediaPlayer/IJKMediaPlayer.xcodeproj
六、打包 framwork
1、配置 Release 模式:
2、打包真机 framework
选择你连接的手机或者 Generic iOS Device,然后按键 command+b 编译即可
如果之前的步骤删除了 compile-ffmpeg.sh 中 armv7, 这里会报错, 我们直接注释掉就好,如果注释后还是报这个错就全局搜索你的电脑 找到对应的文件 打开看里面的 armv7是否注释,config文件同理。
3、打包模拟器 framework,随便选择一个模拟器 直接编译
4、合并 framework:如果只需要真机运行或者模拟器运行, 可以不用合并, 直接找到对应的 framework 导入项目即可; 一般我们为了方便会合并 framework, 这样就同时支持模拟器和真机运行.
先找到生成 framework 的目录:
打开终端, 先 cd 到 Products 目录下
然后执行: lipo -create Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output IJKMediaFramework
合并完成:
可以看到这里生成了一个大概两倍大小的文件, 将生成的IJKMediaFramework文件替换掉真机framework中的IJKMediaFramework文件,然后这个替换掉文件的真机framework就是我们需要的通用的framework了。
七、集成 framework 到项目中
导入 framework
直接将IJKMediaFramework.framework拖入到工程中即可
注意记得勾选Copy items if needed和 对应的target
添加下列依赖到工程
libc++.tbd( 编译器选 gcc 的请导入libstdc++.tbd)
libz.tbd
libbz2.tbd
AudioToolbox.framework
UIKit.framework
CoreGraphics.framework
AVFoundation.framework
CoreMedia.framework
CoreVideo.framework
MediaPlayer.framework
MobileCoreServices.framework
OpenGLES.framework
QuartzCore.framework
VideoToolbox.framework
导入 ijkplayer 头文件运行一下项目, 如果遇到了类似这样的错误:
可能是因为导入的依赖库不全, 比如缺少 libc++.tbd, 请再次对照添加好所有的依赖库:
最后就完成了,如有问题请提问点心,也可以找我要https的完整framework