1.IJKPlayer的概述
ijkplayer 是一款基于ffmpeg的视频播放器框架, 支持 Android 和 iOS。
下文将简要介绍iOS侧的IJKPlayer及其集成。
2.IJKPlayer的clone及获取ffmpeg
git上的官方步骤:
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios
cd ijkplayer-ios
git checkout -B latest k0.8.8
./init-ios.sh(科学上网)
复制代码
3.配置编解码器多格式支持
默认编解码为 module-lite.sh,格式最少,如果足够使用,可以跳过这一步 配置文件在 config 目录下
-
module-default.sh 最多的编解码器/格式(打包时体积最大)
-
module-lite-hevc.sh 较少的编解码器/格式(包括hevc)
-
module-lite.sh 较少的编解码器/格式(默认情况)
依次执行以下命令,将默认编译的 module-lite.sh 更改为 module-default.sh
# 进入 config 目录
cd config
# 删除当前的 module.sh 文件
rm module.sh
# 可根据需要替换为 `module-default.sh`, `module-lite-hevc.sh`, `module-lite.sh`
# 创建软链接 module.sh 指向 module-default.sh
ln -s module-default.sh module.sh
cd ..
cd ios
sh compile-ffmpeg.sh clean
复制代码
4.支持Https
如果我们需要支持Https,则添加 openssl 相关包,若不需要 Https 则跳过这步。
获取并编译openssl相关包
cd ..
# 获取 openssl 并初始化
./init-ios-openssl.sh
cd ios
# 在模块文件 module.sh 中添加配置 以启用 openssl 组件
echo 'export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-openssl"' >> ../config/module.sh
./compile-ffmpeg.sh clean
./compile-openssl.sh all (如果不需要https,跳过这一步)
复制代码
5.编译ffmpeg
./compile-ffmpeg.sh all
复制代码
如果编译 ffmpeg 时报错:error: unknown directive .arch armv7-a,这是因为最新的 Xcode9.4 弱化了对 32 位的支持,解决方式有两种: 1.可以在 compile-ffmpeg.sh 中删除 armv7,修改为 FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64" ;【不推荐,可能还有适配的需求】 2.使用之前的 Xcode 版本,这里我用的是 9.1 可以顺利编译,点这里下载 ,并指定 Xcode 路径
sudo xcode-select -s 【Xcode9.1路径】/Contents/Developer
复制代码
6.打开IJKMediaPlayer项目
添加 openssl 相关包以支持 Https
推荐使用 IJKMediaFramework这个target,并导入openssl相关包7.打包 Framework
集成 ijkplayer 有两种方法: 一种方法是按照IJKMediaDemo工程中那样,直接导入工程IJKMediaPlayer.xcodeproj, 在这里不做介绍, 如下图:
第二种方法是把 ijkplayer 打包成framework导入工程中使用。 下面开始介绍如何打包IJKMediaFramework.framework。注意:默认打包为动态库,若要打包成静态类,需要手动选择为静态库,具体操作如下。而如果我们需要打包适配所有模拟器/真机架构的库,则需要手动修改【Build Setting】中的Build Active Architecture Only属性。
如图,上图则表示在Debug模式下的库仅支持当前模拟器/真机架构,而Release模式下则支持所有模拟器/真机的架构。
这里以Release模式为例,需要Debug版同理,配置Release模式:
打包模拟器framework
打包真机framework
如果之前的步骤删除了 compile-ffmpeg.sh 中 armv7, 可能会报错,直接把报错的 armv7 注释掉就好
结果:
合并操作:
1.打开终端cd到Products目录下
2.执行以下命令完成合并
lipo -create Release-iphoneos/IJKMediaFrameworkWithSSL.framework/IJKMediaFrameworkWithSSL Release-iphonesimulator/IJKMediaFrameworkWithSSL.framework/IJKMediaFrameworkWithSSL -output IJKMediaFrameworkWithSSL
复制代码
3.替换真机 IJKMediaFrameworkWithSSL得到最终需要的包
7.导入framework到项目中
-
将得到的包拖到项目中,注意勾选 Copy items if needed 和 对应的 target
-
添加以下依赖
libc++.tbd
libbz2.tbd
AudioToolbox.framework
CoreGraphics.framework
AVFoundation.framework
CoreMedia.framework
CoreVideo.framework
MediaPlayer.framework
MobileCoreServices.framework
OpenGLES.framework
QuartzCore.framework
VideoToolbox.framework
复制代码
并在需要的地方导入头文件,command+B编译成功,集成成功。
#import <IJKMediaFrameworkWithSSL/IJKMediaFrameworkWithSSL.h>
复制代码
【若我们在打包时将库打包为动态库】导入后会出现下列问题: 解决方案: 在General--Embedded Binaries手动导入framework。