直播原理
一个简单的直播流程是:
1 | app -> 视频采集 -> 编码 -> 推流 -> 服务器 |
其中涉及到的技术点比较多:
流媒体传输协议
RTMP
- RTMP:实时消息传输协议,Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的开放协议,因为是开放协议所以都可以使用了。
- RTMP协议用于对象、视频、音频的传输。
- 这个协议建立在TCP协议或者轮询HTTP协议之上。
- RTMP协议就像一个用来装数据包的容器,这些数据可以是FLV中的视音频数据。一个单一的连接可以通过不同的通道传输多路网络流,这些通道中的包都是按照固定大小的包传输的
- RTMP协议用于对象、视频、音频的传输。
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 | /usr/local/etc/nginx/nginx.conf (配置文件路径) |
四: 启动nginx
输入 开启服务器
1 | nginx |
在浏览器中 输入 http://localhost:8080
如果出现下图, 则表示安装成功:
配置 nginx
一: 配置Nginx,支持http协议拉流
在终端输入
1 | open -t /usr/local/etc/nginx/nginx.conf |
打开nginx配置文件,在http属性下找到:
1 | location / { |
在下面添加,成为:
1 | location / { |
二: 配置Nginx,支持rtmp协议推流
在终端输入1
open -t /usr/local/etc/nginx/nginx.conf
打开nginx配置文件, 文件的末尾(最后一个 “}” 下一行 )添加:
1 | rtmp { |
三: 应用配置
重启下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就可以播放该链接。