iOS直播教程

直播原理

一个简单的直播流程是:

1
2
app        -> 视频采集   ->  编码    -> 推流     -> 服务器
服务器 -> 拉流 -> 解码 -> 播放 -> app

其中涉及到的技术点比较多:

流媒体传输协议

RTMP

  • RTMP:实时消息传输协议,Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议,因为是开放协议所以都可以使用了。
    • RTMP协议用于对象、视频、音频的传输。
      • 这个协议建立在TCP协议或者轮询HTTP协议之上。
      • RTMP协议就像一个用来装数据包的容器,这些数据可以是FLV中的视音频数据。一个单一的连接可以通过不同的通道传输多路网络流,这些通道中的包都是按照固定大小的包传输的

HLS (HTTP Live Streaming)

HTTP Live Streaming(HLS)是苹果公司(Apple Inc.)实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,主要应用在iOS系统,为iOS设备(如iPhone、iPad)提供音视频直播和点播方案。HLS点播,基本上就是常见的分段HTTP点播,不同在于,它的分段非常小。

相对于常见的流媒体直播协议,例如RTMP协议等,HLS直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。

m3u8,是HTTP Live Streaming直播的索引文件。

直播iOS实战

服务端配置

安装 nginx

使用HomeBrew 安装 nginx
没安装过HomwBrew的 看一下 HomeBrew主页 安装一下

一: 增加home-brew对nginx的扩展

1
brew tap homebrew/nginx

二: 安装Nginx服务器和rtmp模块

1
brew install nginx-full --with-rtmp-module

三: 查看是否安装成功

1
brew info nginx-full

1
2
3
4
5
6
7
8
/usr/local/etc/nginx/nginx.conf (配置文件路径)
/usr/local/var/www (服务器默认路径)
/usr/local/Cellar/ (安装路径)
open -t /usr/local/etc/nginx/nginx.conf 可以用文本编辑器打开配置文件
nginx -s reload 重新加载配置
nginx -s reopen 重新打开log
nginx -s stop 停止nginx
nginx -s quit 退出nginx

四: 启动nginx

输入 开启服务器

1
nginx

在浏览器中 输入 http://localhost:8080
如果出现下图, 则表示安装成功:

配置 nginx

一: 配置Nginx,支持http协议拉流

在终端输入

1
open -t  /usr/local/etc/nginx/nginx.conf

打开nginx配置文件,在http属性下找到:

1
2
3
4
location / {
root html;
index index.html index.htm;
}

在下面添加,成为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location / {
root html;
index index.html index.htm;
}

location /hls {
#支持http协议拉流
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /usr/local/var/www;
add_header Cache-Control no-cache;
}

二: 配置Nginx,支持rtmp协议推流

在终端输入

1
open -t  /usr/local/etc/nginx/nginx.conf

打开nginx配置文件, 文件的末尾(最后一个 “}” 下一行 )添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
rtmp {
server {
listen 1990;

application hls{

live on;
record off;
hls on;
hls_path /usr/local/var/www/hls;
hls_fragment 1s;
}
}
}

三: 应用配置

重启下nginx就行

1
nginx -s reload

使用 ffmepg 测试推流

在iOS端使用 LFLiveKit 推流

LFLiveKit它已经帮我们实现了视频采集、后台录制、美颜功能、支持h264、AAC编码,动态改变速率,RTMP传输等
LFLiveKit主页

使用LFLiveKit demo 推流

下载源代码后,进入sample/LFLiveKitDemo 目录,运行下

1
pod install

打开LFLiveKitDemo.xcworkspace 工程

LFLivePreview.m文件的362行改为:

1
stream.url = @"rtmp://10.45.33.96:1990/hls/abc";

url对应的是 rtmp://[nginx服务器地址] : [端口] / [配置的应用] / 随便写

然后真机运行效果如下:

测试LFLiveKit demo 推流

保证nginx服务器是开启状态
点击上面demo中的开始直播后:

在mac Safari 浏览器中输入 http://localhost:8080/hls/abc.m3u8 查看效果:

相对应的,直接使用iOS自带的AVPlayer就可以播放该链接。