ijkplayer学习笔记(一)——下载、编译、合成库


ijkMediaPlayer

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

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”并不需要提前创建。是合并后的文件名称,执行命令以后会自动输出。如图:

lipo合并

4.5、将合并后的文件IJKMediaFramework拖入到Release-iphoneos/IJKMediaFramework.framework中,最后就得到了合并后的framework,可以通过lipo -info查看生成的指令集

你可能感兴趣的:(ijkplayer学习笔记(一)——下载、编译、合成库)