如果不了解原理,可以看这篇文章iOS直播app个人实践–原理。
用B站开源的ijkplayer做播放器。直播app中,需要用到的一个很重要的开源框架ijkplayer,集成这个框架是比较有难度的。
一、编译ijkPlayer
1.1、下载ijkPlayer
去到B站得github主页,找到ijkplayer项目,下载源码.
1.2、编译ijkPlayer
1.2.1、运行ijkPlayerMediaDemo
- 提示’libavformat/avformat.h’ file not found
- 原因:因为libavformat是ffmpeg中的库,而ijkplayer是基于ffmpeg这个库的,因此需要导入ffmpeg
- 解决:查看ijkplayer的README.md,一般都会有说明。
- 步骤一:找到init-ios.sh脚本文件
- 步骤二:打开终端,cd进入到ijkplayer-master的目录中
- 步骤三:输入./init-ios.sh,就会执行当前脚本了。
- 执行完脚本后,就会发现ijkplayer中有ffmpeg了
1.2.2、下载好ffmpeg源码后,再次运行Demo
- 发现还是报’libavformat/avformat.h’ file not found错误
- 原因:执行init-ios.sh,仅仅是下载源码,但是源码并没有参与编译,需要把源码编译成.a文件
- 解决:查看ijkplayer的README.md
编译ffmpeg库
- 步骤一:进入到脚本文件的目录下
- 步骤二:执行./compile-ffmpeg.sh clean
- 步骤二功能:删除一些文件和文件夹,为编译ffmpeg.sh做准备,在编译ffmpeg.sh的时候,会自动创建刚刚删除的那些文件,为避免文件名冲突,因此在编译ffmpeg.sh之前先删除等会会自动创建的文件夹或者文件
- 步骤三:执行./compile-ffmpeg.sh all,真正的编译各个平台的ffmpeg库,并生成所以平台的通用库.
执行compile-ffmpeg.sh all后
1.2.3、再次运行Demo
编译完ffmpeg后,IJKMediaPlayer库中显示
二、集成ijkplayer
2.1、把IJKMediaPlayer打包成静态库
如何打包,请参考,iOS中集成ijkplayer视频直播框架,写的非常不错,就不一一详细介绍了,但是只有发布版本的库。
直接把ijkplayer库拖入到自己的工程中, 调试的话,拖入调试版本的ijkplayer库,发布的话,拖入发布版本的ijkplayer库
导入ijkplayer依赖的库,具体可以查看ijkplayer的README
这里有个打包好的git地址。
三、使用ijkplayer直播
3.1、ijkplayer用法简介
ijkplayer用法比较简单,其实只要有直播地址,就能直播了
3.2、播放调用
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// 设置直播占位图片
NSURL *imageUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://img.meelive.cn/%@",_live.creator.portrait]];
[self.imageView sd_setImageWithURL:imageUrl placeholderImage:nil];
// 拉流地址
NSURL *url = [NSURL URLWithString:_live.stream_addr];
// 创建IJKFFMoviePlayerController:专门用来直播,传入拉流地址就好了
IJKFFMoviePlayerController *playerVc = [[IJKFFMoviePlayerController alloc] initWithContentURL:url withOptions:nil];
// 准备播放
[playerVc prepareToPlay];
// 强引用,反正被销毁
_player = playerVc;
playerVc.view.frame = [UIScreen mainScreen].bounds;
[self.view insertSubview:playerVc.view atIndex:1];
}
3.3、播放结束
界面不播放,一定要记得结束播放,否则会报内存溢出
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// 界面消失,一定要记得停止播放
[_player pause];
[_player stop];
}
四、ijkplayer拉流播放详解(重点😄😄)
ijkplayer提供的播放类如下。
播放类 | IJKMPMoviePlayerController | IJKAVMoviePlayerController | IJKFFMoviePlayerController |
---|---|---|---|
解码器 | MPMoviePlayerController | AVPlayer | ffmpeg |
解码 | 硬解 | 硬解 | 软解(videotoolbox硬解) |
绘制 | OpenGLES2 |
4.1、ijkplayer播放流程
4.2、ijkplayer下载
4.3、ijkplayer读取数据
4.4、ijkplayer绘制
4.5、ijkplayer声音
如何强制打开硬解
[options setPlayerOptionIntValue:1 forKey:@"videotoolbox"];
opengl如何绘制
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
播放音频
OSStatus status = AudioQueueStart(_audioQueueRef, NULL);
五、播放互动实现
🐷
六、金山云直播方案
金山云需要和商务代表联系才能开通试用。
推流设置 | 美颜等采集设置 | 播放设置 |
---|---|---|