ios开发专题

iOS IJKMediaPlayer库开发直播(拉流)

2022-09-06  本文已影响0人  真香_7e73

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初步集成完毕。

上一篇下一篇

猜你喜欢

热点阅读