ijkplayer集成和坑点

1,032 阅读2分钟

1、新建文件夹,cd到当前目录下,git拉ijkplayer库

cd /Users/xxxxx/Desktop/xxxxx
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios

2、ijkplayer相关配置

cd ijkplayer-ios

不要在master分支操作,新建分支

git checkout -B latest k0.8.8

查看当前分支

git branch

下载ffmpeg

./init-ios.sh

如果遇到443,或者拉不下来,多拉几次,天朝网络问题,没办法!

进入ios目录

cd ios

我这边是不支持armv7,把compile-ffmpeg.sh里面的armv7都删掉,在下面对应的地方删掉

FF_ALL_ARCHS_IOS6_SDK="armv7s i386"
FF_ALL_ARCHS_IOS7_SDK="armv7s arm64 i386 x86_64"
FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"
if [ "$FF_TARGET" = "armv7s" -o "$FF_TARGET" = "arm64" ]; then
    echo "  compile-ffmpeg.sh arm64|i386|x86_64"

编译ffmpeg

./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

如果多次执行上面两条命令,12.0.1以上的OSX系统会报# operation not permitted 需要修改系统脚本附加属性限制

sudo xattr -r -d com.apple.quarantine $filePath

3、现在开始跑工程会发现因为我们删了armv7有问题,但是新版xcode的Build Settings  -->  Architectures  -->  Vaild  Architectures没有这个属性,我们要把版本号调到11.0

image.png

image.png 接着打2个realease的framework包出来

XCode13的项目找不到Product目录

1、IJKMediaPlayer.xcodeproj显示包内容

2、编辑project.pbxproj

3、搜索productRefGroup

4、把productRefGroup的值改成和mainGroup一样

看到Product,show in finder,进入framework目录,合并IJKMediaFramework

image.png

执行: lipo -create 真机framework路径 模拟器framework路径 -output 合并的文件路径

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

image.png

最终,把打出来的IJKMediaFramework替换IJKMediaFramework.framework里面的,就可以拉出来用了

image.png

4、解决ijkplayer卡主线程问题

搜索isApplicationActive


- (void)isApplicationActive:(void(^)(BOOL isActive)) completion {
    dispatch_async(dispatch_get_main_queue(), ^{
        switch (self->_applicationState) {
            case IJKSDLGLViewApplicationForegroundState:
                completion(YES);
            case IJKSDLGLViewApplicationBackgroundState:
                completion(NO);
            default: {
                UIApplicationState appState = [UIApplication sharedApplication].applicationState;
                switch (appState) {
                    case UIApplicationStateActive:
                        completion(YES);
                    case UIApplicationStateInactive:
                    case UIApplicationStateBackground:
                    default:
                        completion(NO);

                }
            }
        }
    });
}


[self isApplicationActive:^(BOOL isActive) {
     if (isActive == YES) {
        [self setupGLOnce];
     }
}];

[self isApplicationActive:^(BOOL isActive) {
    if (isActive == NO) {
        return;
    }

    if (![self tryLockGLActive]) {
        if (0 == (_tryLockErrorCount % 100)) {
            NSLog(@"IJKSDLGLView:display: unable to tryLock GL active: %d\n", _tryLockErrorCount);
        }
        _tryLockErrorCount++;
        return;
    }
    _tryLockErrorCount = 0;
    if (_context && !_didStopGL) {
        EAGLContext *prevContext = [EAGLContext currentContext];
        [EAGLContext setCurrentContext:_context];
        [self displayInternal:overlay];
        [EAGLContext setCurrentContext:prevContext];
    }
    [self unlockGLActive];
 }];


因为要修复ijkplayer在新的XCodeUI卡主线程的问题,需要自己集成ijkplayer,感觉坑还是有不少,而且这个库也很少维护了。写个文章留作纪念!

最后附上Demo链接地址:majunwen.coding.net/p/diary/d/I…