美文网首页ios开发专题
iOS IJKMediaPlayer库开发直播(拉流)

iOS IJKMediaPlayer库开发直播(拉流)

作者: 真香_7e73 | 来源:发表于2022-09-06 17:36 被阅读0次

    ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS。

    一. 下载ijkplayer

    ijkplayer下载地址:https://github.com/Bilibili/ijkplayer

    (1)下载后解压,找到 Ijkplayer Demo,运行

    (2) Ijkplayer Demo 报错 'libavformat/avformat.h' file not found

    原因:因为libavformat是ffmpeg中的库,而ijkplayer是基于ffmpeg这个库的,因此需要导入ffmpeg

    解决:通过脚本下载ffmpeg

    image

    init-ios.sh脚本的作用:下载ffmpeg源码

    如何执行init-ios.sh脚本文件

    1、找到init-ios.sh脚本文件

    image

    2、打开终端,cd进入到ijkplayer的目录中

    image

    3、输入./init-ios.sh,就会执行当前脚本了。

    image

    4、脚本执行结束后,在ijkplayer中就有ffmpeg了。

    image

    (3)下载好ffmpeg源码后,再次运行 Ijkplayer Demo

    发现还是报'libavformat/avformat.h' file not found错误

    原因:执行init-ios.sh,仅仅是下载源码,但是源码并没有参与编译,需要把源码编译成.a文件

    1、 Ijkplayer Demo依赖于IJKMediaPlayer库

    image

    2、打开 IJKMediaPlayer库,查看下源码

    image

    3、发现工程中,.a文件报红,说明文件不存在

    image

    4、解决:查看ijkplayer的README.md

    image

    5、找到compile-ffmpeg.sh脚本

    image

    5、cd到compile-ffmpeg.sh脚本文件的目录下

    image

    6、执行./compile-ffmpeg.sh clean

    image

    7、执行./compile-ffmpeg.sh all

    image

    8、执行完./compile-ffmpeg.sh all

    image

    (4)处理好以上问题,再次运行 Ijkplayer Demo

    Ijkplayer Demo 报错 'libavutil/imgutils.h' file not found

    原因:苹果在 XCode10 和 iOS12 中移除了 libstdc++ 这个库,由 libc++ 这个库取而代之。

    解决:下载libstdc++.tbd文件,然后移进工程中。

    image

    下载链接:GitHub - Heaven7th/Xcode10-libstdc-6.0.9.tbd: Xcode10中缺少的libstdc++6.0.9.tbd库

    (5)处理好以上问题,再次运行 Ijkplayer Demo

    运行成功后,进入页面如下

    image

    二. 集成ijkplayer到工程中

    (1)制作ijkplayer.framework

    1、找到 IJKMediaPlayer,打开相应的工程。

    image

    2、发现该工程缺少「Products」文件夹

    用途:该文件夹是用来保存.ipa、.a、.framework等文件,缺少这个,我们就找不到生成的.framewor库。

    处理:找到 IJKMediaPlayer.xcodeproj ,右击「显示包内容」,打开 project.pbxproj 文件,搜索到如下内容:

    image

    将mainGroup对应的value串,替换到productRefGroup相应的value串,使得mainGroup和productRefGroup的value一样。

    保存并使用xcode重新打开该项目,就能看到「Products」文件夹。

    image

    3、接着点击IJKMediaFramework出现选择框,选择edit scheme,如下图所示:

    image

    4、可以选择两种模式:调试或开发

    image

    5、分别在模拟器和真机(Generic iOS Device也可以)上编译

    image image

    6、打开framework所在的目录,如下图所示:

    image

    7、查看生成的framework

    image

    8、将真机和模拟机合并到一起

    合并命令:lipo -create 真机文件路径 模拟器文件路径 -output 真机文件路径

    真机文件路径:指framework可执行文件的路径

    image

    将红框中的文件拉进终端,终端会显示该文件的路径信息。

    合并报错:have the same architectures (arm64) and can't be in the same fat output file

    原因:真机framework中包含 armv7 arm64,模拟机framework中包含 i386 x86_64,但是Xcode 12以后模拟机编译生成的framework中也会包含arm64,所以就会报arm64错误。

    可以通过lipo -info framework可执行文件路径,检测framework包含哪些平台

    image

    解决:在 Target->BuildSetting->Architectures->Excluded Architectures 中,在Any iOS Simulator SDK 后面添加arm64,这样编译出来的包中就不会包含arm64了。

    image

    问题:有时候编译的模拟器framework只有arm64了,x86_64的没有了。

    解决:依然在Target->BuildSetting中,搜索VALID_ARCHS,在这里是描述你编译时需要包含哪些架构的,在后面添加上x86_64即可。

    image

    Xcode 13 新增User-Defined 设置(如下图)Build Setting -> "+" :通过这个,可以添加属性

    image

    补充目前为止Apple移动设备默认指令集:

    armv6:iPhone2G/3G、iPod 1G/2G

    armv7:iPhone 3GS/4/4s、iPod 3G/4G、iPad 1G/2G/3G、iPad mini

    armv7s:iPhone5、iPhone5c、iPad4

    arm64:iPhone5s及以后、iPad Air、iPad mini2

    9、把以上的问题处理完,再次通过lipo -create命令合并,最后真机sdk就是我们合并后的sdk,支持真机和模拟器使用。

    image

    (2)往工程导入合并后的IJKMediaFramework.framework以及相关依赖框架以及相关依赖框架,如下图:

    image

    (3)代码测试

    
    #import <IJKMediaFramework/IJKFFMoviePlayerController.h>
    @interface PlayLiveViewController ()
    @property(nonatomic,strong)IJKFFMoviePlayerController * player;
    @end
    
    @implementation PlayLiveViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        IJKFFOptions *options = [IJKFFOptions optionsByDefault]; //使用默认配置
        NSURL * url = [NSURL URLWithString:@"http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear2/prog_index.m3u8"];
        self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:options]; //初始化播放器,播放在线视频或直播(RTMP)
        self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
        self.player.view.frame = self.view.bounds;
        self.player.scalingMode = IJKMPMovieScalingModeAspectFit; //缩放模式
        self.player.shouldAutoplay = YES; //开启自动播放
        
        self.view.autoresizesSubviews = YES;
        [self.view addSubview:self.player.view];
    }
    
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        [self.player prepareToPlay];
    }
    
    -(void)viewDidDisappear:(BOOL)animated {
        [super viewDidDisappear:animated];
        [self.player shutdown];
    }
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    

    IJKMediaPlayer库 :https://gitee.com/xu_sheng_jie/ijkmedia-player.git

    到此,IJKMediaPlayer初步集成完毕。

    相关文章

      网友评论

        本文标题:iOS IJKMediaPlayer库开发直播(拉流)

        本文链接:https://www.haomeiwen.com/subject/rhignrtx.html