iOS IJKMediaPlayer库开发直播(拉流)
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
imageinit-ios.sh脚本的作用:下载ffmpeg源码
如何执行init-ios.sh脚本文件
1、找到init-ios.sh脚本文件
image2、打开终端,cd进入到ijkplayer的目录中
image3、输入./init-ios.sh,就会执行当前脚本了。
image4、脚本执行结束后,在ijkplayer中就有ffmpeg了。
image(3)下载好ffmpeg源码后,再次运行 Ijkplayer Demo
发现还是报'libavformat/avformat.h' file not found错误
原因:执行init-ios.sh,仅仅是下载源码,但是源码并没有参与编译,需要把源码编译成.a文件
1、 Ijkplayer Demo依赖于IJKMediaPlayer库
image2、打开 IJKMediaPlayer库,查看下源码
image3、发现工程中,.a文件报红,说明文件不存在
image4、解决:查看ijkplayer的README.md
image5、找到compile-ffmpeg.sh脚本
image5、cd到compile-ffmpeg.sh脚本文件的目录下
image6、执行./compile-ffmpeg.sh clean
image7、执行./compile-ffmpeg.sh all
image8、执行完./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,打开相应的工程。
image2、发现该工程缺少「Products」文件夹
用途:该文件夹是用来保存.ipa、.a、.framework等文件,缺少这个,我们就找不到生成的.framewor库。
处理:找到 IJKMediaPlayer.xcodeproj ,右击「显示包内容」,打开 project.pbxproj 文件,搜索到如下内容:
image将mainGroup对应的value串,替换到productRefGroup相应的value串,使得mainGroup和productRefGroup的value一样。
保存并使用xcode重新打开该项目,就能看到「Products」文件夹。
image3、接着点击IJKMediaFramework出现选择框,选择edit scheme,如下图所示:
image4、可以选择两种模式:调试或开发
image5、分别在模拟器和真机(Generic iOS Device也可以)上编译
image image6、打开framework所在的目录,如下图所示:
image7、查看生成的framework
image8、将真机和模拟机合并到一起
合并命令: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即可。
imageXcode 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初步集成完毕。