关于B站播放器ijkPlayer的集成和遇到的bug(持续回复解答,ios)(QQ:479069761)

    xiaoxiao2021-03-25  122

    首先是准备工作

    如果你的电脑(仅针对mac)未安装Homebrew命令工具,清闲安装

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

    brew install git

    brew install yasm

    创建一个文件夹  mycode(名字随意,目的为了方便找到)

    在终端执行

    cd mycode

    git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-ios

    cd ijkplayer-ios  

    ./init-ios.sh

    执行完后

    若需要更改ffmpeg  一些功能的使用  

    比如  支持分段视频(一个视频多个片段)的播放

    可以更改 下图中的文件中

    打开如图标记的这个文件 找到concat有两条相关

    将前面的disable 都改为enable (本身是的就不用动了啦) 然后别忘记保存

    接着执行

    cd ios

    ./compile-ffmpeg.sh clean

    ./compile-ffmpeg.sh all

    然后等待编译完成 这是一个漫长的过程 此时编译的是ffmpeg

    剩下的就是和bilibili文档一样

    导入相应的工程 B站提供的是不打包直接拖入工程 同样你可以选择打包 然后在拖入工程的为framework 当然这时并没有结束 如果需要播放分片视频 还要对ijkplayer做处理 打开如下文件 为了实现播放分片视频 比如加上如下框中的三行代码,保证播放器的安全开启

    ijkmp_set_option(_mediaPlayer,IJKMP_OPT_CATEGORY_FORMAT,"safe",0);

    ijkmp_set_option(_mediaPlayer,IJKMP_OPT_CATEGORY_PLAYER,"protocol_whitelist","ffconcat,file,http,https");

    ijkmp_set_option(_mediaPlayer,IJKMP_OPT_CATEGORY_FORMAT,"protocol_whitelist","concat,http,tcp,https,tls,file");

    之后使用方法

    #pragma mark -

    #pragma mark   ==============读写文件==============

    @interface GLVideoDetailInfoModel :NSObject

    @property (nonatomic,copy)NSString *duration;

    @property (nonatomic,copy)NSString *size;

    @property (nonatomic,copy)NSString *url;

    @end

    - (NSURL *)writeTofeildWithData:(NSArray *)urlArr {

        // 1.找到Documents文件夹路径

        NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];

        // 2.创建要存储的内容:字符串

        NSString *str =@"ffconcat version 1.0";

        for (GLVideoDetailInfoModel *modelin urlArr) {

            str = [NSStringstringWithFormat:@"%@\nfile %@\nduration %.0f",str,model.url,[model.durationfloatValue] / 1000.0];

        }

        DLog(@"分片视频数据:%@",str);

        // 3.需要知道字符串最终存储的地方,所以需要创建一个路径去存储字符串

        NSString *strPath = [documentsPathstringByAppendingPathComponent:@"videoUrl.concat"];

        // 4.将字符串写入文件

        [str writeToFile:strPathatomically:YESencoding:NSUTF8StringEncodingerror:nil];

        NSURL *URL = [[NSURLalloc]initFileURLWithPath:strPath];

        

        return URL;

    }

    此方法获取写入本地的拼接好的ffmpeg的播放地址 传给播放器 即可使用播放 但是必须要各个分片视频的长度 单位为s(秒) 如果想使用打包好的framework 请看下面 打开这个工程 选择真机或者模拟器 运行 成功之后打开如下图所示

    两个文件夹下面的framework就是打包好的 直接当成第三方拖进工程即可使用(当然其他框架还是要自己添加喽)

    关于和七牛播放器冲突问题的解决

    其实这种情况遇到的人应该是很少很少

    但是我的项目就是这么蛋疼的需要这个功能, 七牛的播放器不支持分片视频的播放,自己的播放器支持分片播放,直播又不能及时替换成ijkplayer播放器来做,两个播放器都是基于ffmpeg 底层实现的视频解码播放,因为底层而冲突,导致的结果是ijkplayer不能正常播放分片视频,因为项目自动识别先使用了七牛的ffmpeg的版本,只是因为我们的xcode的太脆弱了,为了为了解决问题 突然想到了用ijkplayer的底层ffmpeg来替换七牛的 只是开了个协议 于是尝试用ijkplayer的ffmpeg替换了七牛的ffmpeg 然后尝试播放分片视频 结果是完美的解决了问题

    But

    如果是ios8以上,就不用那么麻烦了,直接使用动态库,冲突根本不是问题

    转载请注明原文地址: https://ju.6miu.com/read-13703.html

    最新回复(0)