IJKPlayerFramework打包

904 阅读1分钟

之前IJKPlayerFramework 存在问题

  • 不支持 armv 7 架构
  • 归档时由于 bitcode 的设置问题,无法归档成功
  • 非主线程调用 UIKit 中的API

如何打出一个可用的 IJKPlayerFramework,步骤如下:

  • 获取最新的ijk开源代码,版本是 k0.8.8
  • 重新 checkout 出一个分支来用于打包 framwork
git checkout -b dev_framwork // 即从当前 master 分支checkout 出名为 dev_framwork 的分支 
  • 修改脚本 “init-ios.sh” 中的依赖的 ffmpeg 版本
#   修改为支持 ff4.0 的版本 
IJK_FFMPEG_COMMIT=ff4.0--ijk0.8.25--20190618--001
  • 进入“config”目录中修改“module-lite.sh”脚本如下:
#   注释掉如下 2 项配置
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver"
# export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-vda"

#   添加 1 项配置
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsf=eac3_core"
  • 打开“ios/tools/do-compile-ffmpeg.sh ”脚本,添加如下配置
FFMPEG_CFG_FLAGS_ARM="$FFMPEG_CFG_FLAGS_ARM --disable-asm"
  • 分别进入 ffmpeg-arm64、ffmpeg-armv7、ffmpeg-i386 和 ffmpeg-x86_64目录下,将文件夹“libavutil”下的“application.c”如下代码注释
//#if CONFIG_HTTPS_PROTOCOL
//    #include <openssl/evp.h>
//    void dirty_openssl_extra(void) {
//        OPENSSL_add_all_algorithms_noconf();
//    }
//#endif
  • 依次执行脚本
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all  
  • 执行成功后,即可进入“ios/IJKMediaPlayer”进行打包,需要注意的是“IJKSDLGLView”有在主线程调用 UIKit 中的API场景,因此需要修改代码如下:
- (BOOL)isApplicationActive
{
    switch (_applicationState) {
        case IJKSDLGLViewApplicationForegroundState:
            return YES;
        case IJKSDLGLViewApplicationBackgroundState:
            return NO;
        default: {
            if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0) {
                UIApplicationState appState = [UIApplication sharedApplication].applicationState;
                switch (appState) {
                   case UIApplicationStateActive:
                       return YES;
                   case UIApplicationStateInactive:
                   case UIApplicationStateBackground:
                   default:
                       return NO;
                }
            } else {
            __block BOOL isApplicationActive = NO;
            dispatch_semaphore_t sem = dispatch_semaphore_create(0);
            dispatch_async(dispatch_get_main_queue(), ^{
                UIApplicationState appState = [UIApplication sharedApplication].applicationState;
                switch (appState) {
                    case UIApplicationStateActive:
                        isApplicationActive = YES;
                    case UIApplicationStateInactive:
                    case UIApplicationStateBackground:
                    default:
                        isApplicationActive = NO;
                }
                dispatch_semaphore_signal(sem);
            });
            dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
            return isApplicationActive;
            }
        }
    }
}

再进行打包,分别进行模拟器和真机打包后进行合并操作,支持 i386 armv7 x86_64 arm64 架构

参考文章:

www.samirchen.com/complie-ijk…