AndroidiOS ijkplayer编译步骤及相关问题解决

Posted 安卓开发-顺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AndroidiOS ijkplayer编译步骤及相关问题解决相关的知识,希望对你有一定的参考价值。

目录

一、iOS

二、Android

三、导出库文件 


一、ios

     基于B站开源代码编译(https://github.com/bilibili/ijkplayer

  1. :准备一台Mac电脑,本文使用macOS 12.1
  2. :安装XCode开发工具,本文使用xcode 13.4.1
  3. :安装 homebrew、git和yasm软件
  4. :打开终端运行窗口,进入一个自己的开发文件夹,执行:git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios
  5. :执行命令:cd ijkplayer-ios
  6. :执行命令:git checkout -B latest k0.8.8 本文是基于k0.8.8分支
  7. :执行命令:./init-ios.sh (这一步会完成一些初始化工作,并去GitHub拉取FFmpeg代码)
    1. 如果操作文件时没有权限,请执行 chmod 777 init-ios.sh 来修改为可读可写权限, 下面遇到类似错误,同样方式处理即可
  8. :执行命令:./init-ios-openssl.sh 初始化https相关内容 

  9. :执行命令:cd ios (进入iOS文件夹)
  10. :执行命令:./compile-openssl.sh all  编译https相关内容
  11. :执行命令:./compile-ffmpeg.sh clean 不必每次都clean 除非有ffmpeg相关修改
  12. :执行命令:./compile-ffmpeg.sh all 编译ffmpeg库,此步骤十分重要,ijkplayer就是基于ffmpeg来封装
    1. 关于遇到module.shmodule-lite.sh 命令行找不到等问题的解决方案
      1. 直接来到和ios平级的config文件夹下,执行rm module.sh 删除module.sh
      2. 然后回到根目录下执行 ./init-config.sh即可(此步骤会自动拷贝module-lite.sh文件内容到module.sh)
    2. 关于遇到:error:unknown derective .arch armv7-a的报错的解决方案
      1. 方案一、删除armv7(32位)相关架构的编译代码,iPhone5s以上的手机都是64位的cup架构了,应用商店也不在支持armv7(32),因此支持删除也是可以的,具体实现如下
        1. 修改 ios文件夹下compile-ffmpeg.sh 

          第24行 改为: FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
          第120行 改为: if [ "FFTARGET"="armv7s"−o" FF_TARGET" = "arm64" ]; then
          第159行 改为: echo " compile-ffmpeg.sh arm64|i386|x86_64"

      2. 方案二、兼容armv7
        1. 到ios/tools文件夹下,修改do-compile-ffmpeg.sh文件
        2. 在187行(行数可能会变化,找这行代码为准 :FF_XCRUN_CC="xcrun -sdk $FF_XCRUN_SDK clang")下面添加如下内容:

          echo "----- zhangshun modify for armv7 ---------- begin"
          if [ "$FF_ARCH" = "arm64" ]
          then
              FF_AS="gas-preprocessor.pl -arch aarch64 -- $FF_XCRUN_CC"
          else
              FF_AS="gas-preprocessor.pl -- $FF_XCRUN_CC"
          fi
          echo "----- zhangshun modify for armv7 ---------- end"
    3. 关于缓存问题的解决方案:
      1. 执行./compile-ffmpeg.sh clean 清除之前构建内容即可
  13. :编译完成后 用xcode 打开ios/IJKMediaDemo/IJKMediaDemo.xcoderoj运行看效果
  14. :导出库文件,放到其他项目中使用

二、android

基于B站开源代码编译(https://github.com/bilibili/ijkplayer

由于Window下直接编译坑太多,建议安装Ubuntu系统进行编译

  1. :安装Ubuntu系统,并进入
  2. :下载Android NDK r10e(官方建议r10e的版本)注意是Linux版本
  3. :配置NDK环境变量,注意在Ubuntu下配置
  4. :安装 git 、AndroidStudio 并配置SDK环境变量 注意是在Ubuntu下面操作
  5. :打开终端运行窗口,进入一个自己的开发文件夹,执行:git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
  6. :执行命令:cd ijkplayer-android
  7. :执行命令:git checkout -B latest k0.8.8 本文是基于k0.8.8分支
  8. :执行命令:./init-android.sh (这一步会完成一些初始化工作,并去GitHub拉取FFmpeg代码)
    1. 如果操作文件时没有权限,请执行 chmod 777 init-android.sh 来修改为可读可写权限, 下面遇到类似错误,同样方式处理即可
  9. :执行命令:./init-android-openssl.sh 初始化https相关内容 

  10. :执行命令:cd android/contrib
  11. :执行命令:./compile-openssl.sh armv7a 编译https相关内容,指定了armv7a,也可以写all 编译所有的cpu架构
  12. :执行命令:./compile-ffmpeg.sh clean 不必每次都clean 除非有ffmpeg相关修改
  13. :执行命令:./compile-ffmpeg.sh armv7a 编译ffmpeg库,此步骤十分重要,ijkplayer就是基于ffmpeg来封装
    1. 关于遇到module.shmodule-lite.sh 命令行找不到等问题的解决方案
      1. 直接来到和android平级的config文件夹下,执行rm module.sh 删除module.sh
      2. 然后回到根目录下执行 ./init-config.sh即可(此步骤会自动拷贝module-lite.sh文件内容到module.sh)
    2. 关于缓存问题的解决方案:
      1. 执行./compile-ffmpeg.sh clean 清除之前构建内容即可
  14. :执行命令  cd.. 回到 android目录下
  15. :执行./compile-ijk.sh armv7a  也可以选择all  根据需求来定
  16. :拷贝编译生成的so进行使用即可
    1. android--ijkplayer--ijkplayer-armv7a--src--main--libs

三、导出库文件 

1、Android端直接拷贝so和ijkplayer-java-release(建议打包成aar)库去使用就可以了

2、这里主要说明下iOS 端

  1. 真机下 framework库打包导出
    1. 直接打开ios/IJKMediaPlayer工程
    2. edit scheme 选择release​​​​​​​
    3. 选择Any iOS Device 然后运行
    4. 运行后在Products中生成一个IJKMediaFramework,这就是真机对于的库文件,show in Finder 拷贝出来即可。
    5. 如果没有Products文件夹,在访达中右键IJKMediaPlayer.xcodeproj 显示包内容
    6. 打开project.pbxproj文件,然后搜索productRefGroup
    7. 将mainGroup的值复制给productRefGroup,command+s保存,再打开项目,你就可以在Xcode中找到Products目录了
  2. 模拟器下 framework库打包导出
    1. 如果你是xcode 12 及以上 ,请先按照下面的合并报错的解决办法来提前配置,避免报错重打
    2. 参考真机步骤即可,只需要在选择目标设备时把Any iOS Device 改成一个模拟器即可​​​​​​​ 
  3. 合并真机与模拟器的库生成最终的库文件
    1. 先说明下为啥要合并,真机下的库文件里面只有arm64 armv7等手机上的CPU架构,而模拟器下的有x86_64、i386架构
    2. 通过以上两步我们得到了两个IJKMediaFramework文件,下面我们通过 lipo 命令进行合并 得到最终的库
    3. lipo -create /Users/user/Desktop/ijk-bilibili/build/framework/ipone/IJKMediaFramework.framework/IJKMediaFramework /Users/user/Desktop/ijk-bilibili/build/framework/emulator/IJKMediaFramework.framework/IJKMediaFramework -output /Users/user/Desktop/ijk-bilibili/build/framework/merge/IJKMediaFramework.framework/IJKMediaFramework 
    4. 要注意命令的格式 lipo -create “真机framework文件路径” “模拟器framework文件路径” “输出的framework文件路径”

      1. 真机framework文件路径指的是我们从真机编译出的包(IJKMediaFramework.framework)里面的IJKMediaFramework,请仔细看命令

      2. 模拟器framework文件路径的是我们从真机编译出的包(IJKMediaFramework.framework)里面的IJKMediaFramework

      3. 输出的framework文件路径就填 真机framework文件路径就可以,我这里不想把真机库文件给覆盖掉,就复制了一份真机文件,建了个merge文件夹拷贝进去的,大家仔细看我命令就明白了

    5. 合并报错的解决办法:

      1. have the same architectures (arm64) and can't be in the same fat output file

      2. 此异常一般发生在xcode 12 及 以上,因为模拟器打出来的包也有arm64 所以就冲突了,做一个配置去掉模拟器库中的 arm64,重新打包个库即可
      3. 如果打包后在模拟器运行出现找不到x86_64相关的文件,或相关报错,请添加以下配置
      4. 如果你找不到VALID_ARCHS这个选项就点击图中的加号添加上

       

以上就是打包合并相关内容。

以上是关于AndroidiOS ijkplayer编译步骤及相关问题解决的主要内容,如果未能解决你的问题,请参考以下文章

AndroidiOS ijkplayer编译步骤及相关问题解决

iOS ijkplayer 硬解H265(hevc)4k视频问题解决

iOS ijkplayer 硬解H265(hevc)4k视频问题解决

iOS ijkplayer 硬解H265(hevc)4k视频问题解决

直播技术总结ijkplayer的编译到Android平台并测试解码库

B站直播 DEMO ijkplayerDemo