美文网首页iOS开发
iOS开发之ijkplayer的打包framework

iOS开发之ijkplayer的打包framework

作者: chasitu | 来源:发表于2018-11-21 20:29 被阅读47次

    ijkplayerbilibili 开源的一款优秀的播放器, 基于 FFmpeg, 支持 iOS/Android, 点播/直播, 以及多种编码. 官方并不直接提供 framework 框架包, 这样大家可以根据需要选择配置, 自己编译并打包. 但是也让很多第一次使用的小伙伴一脸懵逼, 并且默认配置只支持 http, 如果想播放 https 链接的视频, 那么需要做额外的配置

    本文为 iOS 的编译打包过程, 环境为 Mac + Xcode

    准备工作

    安装 homebrew, git, yasm. (如果已经安装好可以跳过, 不清楚的再来一遍也无妨)

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    brew install git
    brew install yasm
    

    ps:报错-->(Warning: /usr/local/bin is not in your PATH.)

    终端输入命令: export PATH=/usr/local/bin:$PATH
    

    获取 ijkplayer 源码

    在一个合适的位置新建一个文件夹, 假设为桌面, 文件夹名为 ijkplayer.

    打开终端, 输入下面的指令

    # 进入到刚刚新建的文件夹内
    cd ~/Desktop/ijkplayer/
    
    # 获取ijkplayer源码
    git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios
    
    # 进入源码目录
    cd ijkplayer-ios
    
    # 切换分支 (目前为k0.8.8, 可以自行去GitHub查看最新版本号)
    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 并初始化

    cd ..
    ./init-ios.sh
    

    添加 https 支持

    最后会生成支持 https 的静态文件 libcrypto.alibssl.a, 如果不需要可以跳过这一步

    # 获取 openssl 并初始化
    ./init-ios-openssl.sh
    
    cd ios
    
    # 在模块文件中添加一行配置 以启用 openssl 组件
    echo 'export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-openssl"' >> ../config/module.sh
    
    ./compile-ffmpeg.sh clean
    

    编译

    # 如果下一步提示错误`xcrun: error: SDK "iphoneos" cannot be located`, 请执行`sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/`, 再重新执行下一步
    
    # 编译openssl, 如果不需要https可以跳过这一步
    ./compile-openssl.sh all
    
    # 编译ffmpeg
    ./compile-ffmpeg.sh all
    

    ps: 如果提示错误:

    ./libavutil/arm/asm.S:50:9: error: unknown directive
            .arch armv7-a
            ^
    make: *** [libavcodec/arm/aacpsdsp_neon.o] Error 1
    

    最新的 Xcode 已经弱化了对 32 位的支持, 解决方法:
    compile-ffmpeg.sh文件中删除 armv7 , 修改如:
    FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
    再重新执行出现错误的命令:

     ./compile-ffmpeg.sh all
    

    打开 IJKMediaPlayer 项目

    用命令:

    open IJKMediaPlayer/IJKMediaPlayer.xcodeproj
    

    或者手动用 Xcode 打开 ios 目录下的 IJKMediaPlayer 项目.

    添加 openssl 相关包以支持 https

    如果不使用 https, 可以跳过此步, 直接开始打包 framwork
    如果使用 https, 那么需要手动给IJKMediaFramework 添加 libcrypto.alibssl.a文件, 默认不会添加

    ps: 这两个依赖库的目录为: ijkplayer-ios/ios/build/universal/lib, 只有进行了上面跟 openssl 相关的操作, 才会在这个目录下有生成 libcrypto.alibssl.a

    image.png

    打包 framwork

    大家会发现除了 IJKMediaFramework 这个 target, 还有一个叫 IJKMediaFrameworkWithSSL, 但是不推荐使用这个, 因为大部分基于 ijkplayer 的第三方框架都是使用的前者, 你把后者导入项目还是会报找不到包的错误, 就算你要支持 https 也推荐使用前者, 然后按照上一步添加 openssl 即可支持

    1.配置 Release 模式如果下图

    image.png
    image.png
    2.打包真机 framework
    选择你连接的手机或者Generic iOS Device
    image.png

    如图操作,然后按键command+b 编译即可

    如果之前的步骤删除了 compile-ffmpeg.sharmv7, 这里会报错, 我们直接注释掉就好(小伙伴仔细看啊,下面两张图不一样的)

    image.png
    image.png

    具体文件路径这样查看

    image.png

    如图操作,然后 command+b 编译即可

    4.合并 framework

    如果只需要真机运行或者模拟器运行, 可以不用合并, 直接找到对应的 framework 导入项目即可; 一般我们为了方便会合并 framework, 这样就同时支持模拟器和真机运行.
    先找到生成 framework 的目录:

    image.png
    image.png
    准备合并:
    打开终端, 先 cdProducts 目录下
    然后执行:lipo -create 真机framework路径 模拟器framework路径 -output 合并的文件路径
    lipo -create Release-iphoneos/IJKMediaFramework.framework/IJKMediaFramework Release-iphonesimulator/IJKMediaFramework.framework/IJKMediaFramework -output IJKMediaFramework
    

    合并完成:
    可以看到这里生成了一个大概两倍大小的文件, 将生成的 IJKMediaFramework 文件替换掉 真机framework 中的 IJKMediaFramework 文件,然后这个替换掉文件的 真机framework 就是我们需要的 通用的framework 了。

    image.png
    image.png

    集成 framework 到项目中

    • 导入 framework
      直接将 IJKMediaFramework.framework 拖入到工程中即可
      注意记得勾选 Copy items if needed 和 对应的 target
    • 添加下列依赖到工程
    1. libc++.tbd ( 编译器选 gcc 的请导入libstdc++.tbd)
    2. libz.tbd
    3. libbz2.tbd
    4. AudioToolbox.framework
    5. UIKit.framework
    6. CoreGraphics.framework
    7. AVFoundation.framework
    8. CoreMedia.framework
    9. CoreVideo.framework
    10. MediaPlayer.framework
    11. MobileCoreServices.framework
    12. OpenGLES.framework
    13. QuartzCore.framework
    14. VideoToolbox.framework
      导入 ijkplayer 头文件运行一下项目, 如果遇到了类似这样的错误:
      image.png
      可能是因为导入的依赖库不全, 比如缺少 libc++.tbd, 请再次对照添加好所有的依赖库:
      image.png

    先整理到这里吧

    转载:https://www.jianshu.com/p/9743a68c2939

    相关文章

      网友评论

        本文标题:iOS开发之ijkplayer的打包framework

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