ijkPlayer按照github上的做法在最新的Xcode上编译打包会出现各种问题,以下是我在编译打包过程遇到的问题记录,应该是全网最新了,希望能够帮助到你,如果有问题,请issue我
一.环境准备
需要安装yasm
和pkg-config
,可用homebrew安装
brew install yasm
brew install pkg-config
代码拉下来后
切换分支到文档制定的k0.8.8
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
照旧文档指令执行
./init-ios.sh
这一步主要是下载ffmpeg的各种架构仓库
添加https支持
最后会生成支持 https 的静态文件 libcrypto.a 和 libssl.a, 如果不需要可以跳过这一步
# 获取 openssl 并初始化
./init-ios-openssl.sh
cd ios
# 在模块文件中添加一行配置 以启用 openssl 组件
# 这一步我不是很确定,我是直接加在compile-openssl.sh文件的最后一行的
echo 'export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-openssl"' >> ../config/module.sh
./compile-ffmpeg.sh clean
三.编译ffmpeg
编译就是运行compile-openssl.sh
文件和compile-ffmpeg.sh
文件
在运行的过程中,报错
AS libavcodec/arm/aacpsdsp_neon.o
./libavutil/arm/asm.S:50:9: error: unknown directive
.arch armv7-a
^
make: *** [libavcodec/arm/aacpsdsp_neon.o] Error 1
make: *** Waiting for unfinished jobs....
最新的 Xcode 已经弱化了对 32 位的支持, 解决方法:
在compile-ffmpeg.sh
中删除armv7
, 修改如:
FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
再重新执行出现错误的命令:./compile-ffmpeg.sh all
需要修改compile-ffmpeg.sh
和compile-openssl.sh中关于armv7
的内容,总共有3处(注:经测试,compile-openssl.sh
中的不需要注释,否则会报错)
报错评论给出的解答(暂未测试):还少个步骤,现在上面 avconfig.h 和 config.h 两个文件都处理完后,再编译IJKMediaPlayer会报错,说好多文件不支持armv7,去项目的TARGETS---IJKMediaFrameworkWithSSL---Build Settings--- Valid Architectures,删掉armv7就可以了
#1
#FF_ALL_ARCHS_IOS8_SDK="armv7 arm64 i386 x86_64"
FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
#2
#if [ "$FF_TARGET" = "armv7" -o "$FF_TARGET" = "armv7s" -o "$FF_TARGET" = "arm64" ]; then
if [ "$FF_TARGET" = "armv7s" -o "$FF_TARGET" = "arm64" ]; then
#3
# echo " compile-ffmpeg.sh armv7|arm64|i386|x86_64"
echo " compile-ffmpeg.sh arm64|i386|x86_64"
#1
#FF_ALL_ARCHS_IOS8_SDK="armv7 arm64 i386 x86_64"
FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
#2
#if [ "$FF_TARGET" = "armv7" -o "$FF_TARGET" = "armv7s" -o "$FF_TARGET" = "arm64" ]; then
if [ "$FF_TARGET" = "armv7s" -o "$FF_TARGET" = "arm64" ]; then
#3
# echo " compile-openssl.sh armv7|arm64|i386|x86_64"
echo " compile-openssl.sh arm64|i386|x86_64"
最后再次执行
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all //编译
添加openssl
相关包以支持https
如果使用 https
, 那么需要手动给IJKMediaFramework
添加 libcrypto.a
和 libssl.a
文件, 默认不会添加
ps: 这两个依赖库的目录为:ijkplayer-ios/ios/build/universal/lib
, 只有进行了上面跟 openssl
相关的操作, 才会在这个目录下有生成libcrypto.a
和libssl.a
碰到问题:
/build/universal/include/libavutil/avconfig.h:34:21: 'armv7/avconfig.h' file not found
解决方案:
直接点击跳不过去,然后可以右键reveal in Log,在报错处找文件目录,
找到avconfig.h
和config.h
注释对应的include "armv7/config.h"
参考阅读:https://www.jianshu.com/p/2669370bee23
四、打包 framwork
首先将debug
改为release
再分别选择真机和模拟器进行编译command+b
点击products文件夹,打开后选择IJKMediaFramework.framework
反键打开show in Finder,在上一级的Products
文件夹内,有两个文件Release-iphoneos
和Release-iphonesimulator
,我们要合并的就是这个两个framework,首先我们cd到products
文件夹中,然后执行
lipo -create Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output IJKMediaFramework
可以看到在products
文件夹中生成了一个framework
文件
用它替换掉Release-iphoneos
中的
IJKMediaFramework
.
五.集成 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
至此,就全部完成了