1、下载工程
点击https://github.com/bilibili/ijkplayer,查看README.md,参照Before Build准备好环境。
因为是学习的是iOS端的工程,所以最后按照Build iOS进行下载。
问题记录:进行到最后一步 ./compile-ffmpeg.sh all报错,
xcrun -sdk iphoneos clang is unable to create an executable file.
C compiler test failed.
搜了一下该问题的解决办法。使用:
sudo xcode-select --switch/Applications/Xcode.app/Contents/Developer/
刚好可以解决我的这个问题
参考:https://blog.csdn.net/BranchLin/article/details/83991694
2、项目结构
打开我们从github下载下来的工程文件ijkplayer-ios,目录如下:
tool- 初始化项目工程脚本
config- 编译ffmpeg使用的配置文件
extra- 存放编译ijkplayer所需的依赖源文件, 如ffmpeg、openssl等
ijkmedia- 核心代码
- ijkplayer- 播放器数据下载及解码相关
- ijksdl- 音视频数据渲染相关
ios- iOS平台上的上层接口封装以及平台相关方法
android- android平台上的上层接口封装以及平台相关方法
在功能的具体实现上,iOS和Android平台的差异主要表现在视频硬解码以及音视频渲染方面,两者实现的载体区别如下:
参考:https://blog.csdn.net/xipiaoyouzi/article/details/74280170
3、运行demo:IJKMediaDemo
运行程序可能会报错:'libavformat/avformat.h' file not found
原因: libavformat 是 ffmpeg 框架中的库,而 ijkplayer 又是基于 ffmpeg 框架的,因此需要导入 ffmpeg。实际上按照READE.md进行到最后一步
./compile-ffmpeg.sh all
并没有真正成功,而是有如下报错:
clang:warning:optimization flag'-fomit-frame-pointer'is not supportedfortarget'armv7'[-Wignored-optimization-argument]
./libavutil/arm/asm.S:50:9: error: unknown directive
armv7架构无法成功。
解决方法1:
在项目中找到compile-ffmpeg.sh脚本文件,删除armv7, 修改如下:
FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
但这样在之后lipo合并的库中就没有armv7版本了,所以在xcode项目的Valid Architectures里就要去掉armv7,否则会报错。
然后再运行./compile-ffmpeg.sh all,成功。再次编译demo工程,成功。
解决方法2:
将tools/do-compile-ffmpeg.sh文件里的armv7架构的情况,改为:
elif [ "$FF_ARCH" = "armv7" ]; then
FF_BUILD_NAME="ffmpeg-armv7"
FF_BUILD_NAME_OPENSSL=openssl-armv7
FF_XCRUN_OSVERSION="-miphoneos-version-min=6.0"
FF_XCODE_BITCODE="-fembed-bitcode"
FFMPEG_CFG_FLAGS="$FFMPEG_CFG_FLAGS --enable-pic --disable-asm"
这样就能编译出包含armv7架构的库了。
但是我这里改为第二种方法后执行./compile-ffmpeg.sh all还是会报之前armv7的问题。不知道问题出在哪里。希望有遇到同样问题的同学给出方案~
参考:https://blog.csdn.net/qiuchangyong/article/details/100781700
4.合成静态库
4.1、打开ijkplayer-ios/ios/IJKMediaPlayer下的工程
4.2、如下图edit scheme
4.3、分别切换到模拟器和Any iOS Device 来build一下工程,在项目中找到Products文件夹找到IJKMediaFramework.framework,然后show in finder
4.4、使用lipo命令将编译出来的适用于模拟器和真机的静态库进行合并
lipo -create /Users/xxx/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-xxxxxx/Build/Products/Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework /Users/xxx/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-xxxxxxx/Build/Products/Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output /Users/xxx/Library/Developer/Xcode/DerivedData/IJKMediaPlayer-xxxxxx/Build/Products/Release-iphoneos/IJKMediaFramework
注意 :create后面两个路径中间的空格,output后面的路径最后“IJKMediaFramework”并不需要提前创建。是合并后的文件名称,执行命令以后会自动输出。如图:
4.5、将合并后的文件IJKMediaFramework拖入到Release-iphoneos/IJKMediaFramework.framework中,最后就得到了合并后的framework,可以通过lipo -info查看生成的指令集