正处于难得的空档期,五一去和大学的基友去日本的东北玩了一大圈(东京-仙台-角馆-田泽湖-秋田-弘前-青森-东京),回来也该收收心了。周末无事,浅浅的研究了一下现在大热的直播技术。同时也在这里记录一下。
直播流程(原理)
PC端/IOS/Android -> 压缩编码过程(H.264/ACC)-> 字幕叠加(视频本身处理)-> 推流 -> CDN -> 直播(终端显示直播流)
直播协议
主流的差不多就这三个:
HLS协议 RTMP协议 HTTP-FLV协议
HLS协议:Apple公司推出的,暂时只支持Safari,切片格式是ts。
实现原理具体就是video,它有一个M3U8索引文件。这个索引文件对应着数个ts格式的文件切片。M3U8文件只是当前时间段的索引,segment.ts都会有个时长,在segment总时长之前,video会重新向服务器请求m3u8文件,这是浏览器自身的行为,此时,服务器会返回新的m3u8文件,更新后的segment.ts文件将会改变(m3u8文件结构并不一定全是由ts文件组成,有可能会嵌套一层m3u8文件)
对于ts文件来说:ts文件会有一个PAT的包,解析时,这个pat的包会告诉你去找一个PMT的包,PMT会告诉你后面要解析到的ts文件中,哪些是视频哪些是音频。
RTMP协议(Real Time Messaging Protocol)(实时性比较好不过使用起来比较复杂,传输的视频格式为flv)
HTTP-FLV结合了HLS的优点,采用HTTP请求,又结合了RTMP低延时的特性,因为中间建立了FLV的长连接,中间通信过程相对RTMP协议就不再复杂
HTTP-FLV优点(相对RTMP):
- 可以在一定程度上避免防火墙干扰(有些机房只允许80端口通过)
- 可以很好的兼容HTTP 302跳转
- 可以使用HTTPS
- 很好的支持移动端
直播源的制作
- 我们需要安装Nginx,mac的话直接如果安装的时候遇到 不存在的问题:brew tap denji/nginx 换一个github源即可。
1
brew install nginx-full --with-rtmp-module
安装成功,启动Nginx,在http://localhost:8080/验证即可。
- 安装ffmpeg
1 | brew install ffmpeg |
配置Nginx
1
2cd /usr/local/etc/nginx/
code nginx.conf1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21rtmp{
server {
listen 1935;
chunk_size 4000;
# RTMP 直播流配置
application rtmplive {
live on;
max_connections 1024;
}
# hls 直播流配置
application hls{
live on;
hls on;
hls_path /usr/local/var/www/hls;
hls_fragment 5s;
}
}
}1
2
3
4
5
6
7
8location /hls {
types{
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /usr/local/var/www;
add_header Cache-Control no-cache;
}准备视频
这里简单起见,在网上找一个mp4格式的测试视频模拟直播流利用ffmpeg推流
这里分别尝试了两种协议的直播。推流方式分别是:
- RTMP:ffmpeg -re -i test2.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/rtmplive/rtmp
使用 VLC 打开 rtmp://localhost:1935/rtmplive/rtmp 直播成功√
- hls:ffmpeg -re -i test2.mp4 -vcodec libx264 -acodec aac -f flv rtmp://localhost:1935/hls/stream
safar打开 http://localhost:8080/hls/stream.m3u8 直播成功√
青森·弘前: