美文网首页
ijkplayer学习笔记(一)——下载、编译、合成库

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

作者: 程序媛的程 | 来源:发表于2021-09-14 10:43 被阅读0次


    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学习笔记(一)——下载、编译、合成库

          本文链接:https://www.haomeiwen.com/subject/dhqfgltx.html