之前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 架构
参考文章: