张科的技术博客

折腾是一种态度

嗨,我是张科(@GarfieldLover),搜狐视频iOS开发者。


这是我用来记录实践和填坑经验心得的地方,欢迎您的访问。


iOS直播app个人实践--播放

如果不了解原理,可以看这篇文章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,一般都会有说明。

ijkPlayer

  • 步骤一:找到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 nginx

编译ffmpeg库

  • 步骤一:进入到脚本文件的目录下
  • 步骤二:执行./compile-ffmpeg.sh clean
  • 步骤二功能:删除一些文件和文件夹,为编译ffmpeg.sh做准备,在编译ffmpeg.sh的时候,会自动创建刚刚删除的那些文件,为避免文件名冲突,因此在编译ffmpeg.sh之前先删除等会会自动创建的文件夹或者文件
  • 步骤三:执行./compile-ffmpeg.sh all,真正的编译各个平台的ffmpeg库,并生成所以平台的通用库.

执行compile-ffmpeg.sh all后 nginx

1.2.3、再次运行Demo

编译完ffmpeg后,IJKMediaPlayer库中显示 nginx

二、集成ijkplayer

2.1、把IJKMediaPlayer打包成静态库

如何打包,请参考,iOS中集成ijkplayer视频直播框架,写的非常不错,就不一一详细介绍了,但是只有发布版本的库。

直接把ijkplayer库拖入到自己的工程中, 调试的话,拖入调试版本的ijkplayer库,发布的话,拖入发布版本的ijkplayer库

导入ijkplayer依赖的库,具体可以查看ijkplayer的README nginx

这里有个打包好的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);

五、播放互动实现

🐷

六、金山云直播方案

金山云代码

金山云需要和商务代表联系才能开通试用。
推流设置 美颜等采集设置 播放设置
推流 美颜 播放