搭建所需基础原理介绍
主播端捕捉音频和视频后,进行H.264的视频编码和AAC的音频编码,再将编码后的数据整合成一个音视频包,然后通过rmtp推到流服务器,直播端用hls或者flv协议方式拉流。
hls延迟较为明显,要十几秒以上,主要是以下延迟
- 服务器端的编码器和流分割器生成TS文件的时间
- 客户端下载TS文件的时间,而通常要求下载完两个TS媒体文件
- 客户端解码并播放
流服务选择测试
github开源 LiveGo
稳定性不好,直播延时大概17s,关键问题是服务经常挂掉,直接编译安装以及使用docker运行,都定期出现服务死掉的情况,报错如下:
nginx作为流媒体
使用nginx的nginx-rtmp-module的hls流媒体服务,老牌服务,稳定性好
插件安装
./configure --with-http_stub_status_module --with-http_ssl_module --add-module=/usr/local/nginx-rtmp-module-1.2.1
make && make install
对应nginx配置
worker_processes 1;
#error_log logs/error.log;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935; #监听的端口
chunk_size 4096;
application rtmplive {
live on;
}
application hls {
live on;
hls on;
hls_path /tmp/hls; #视频流存放地址
hls_fragment 3s; #本地切片长度
hls_playlist_length 9s; #HLS播放列表长度
hls_continuous on; #连续模式。
hls_cleanup on; #对多余的切片进行删除。
hls_nested on; #嵌套模式。
}
}
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 8080;
location /hls {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *; #解决跨域问题
add_header Access-Control-Allow-Methods 'GET,POST';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
}
}
}
遇到问题如下
a. hls_fragment 1s; hls_playlist_length 3s
; 设置太小,延迟会降低,之前配置成5/15s延迟超过20s,改为1/3s后延迟15s,但是切片和播放长度设置太小导致新的问题,播放时频繁出现如下报错,卡了很久才进入房间,最终将时间设置成3/9s后解决问题,如上面配置所示。
b. 跨域问题 add_header Access-Control-Allow-Origin *;
解决Google浏览器访问跨域的问题,BTW,跨域问题在Windows系统浏览器有问题,MAC的Safari浏览器能正常访问
阿里云流媒体服务
如下图所示,打开工作台,添加对应播流和推流域名,按照官方文档提示配置CNAME解析后方可使用
需要注意的是,如果推拉流的域名加上鉴权,默认key有效市时长是30分钟,过时拉流域名就失效,可以无限改大,这样不会失效,如下所示:
不间断推流实现点播
用rzrobert/st-load-master工具可以不通过主播端,直接通过命令,不间断推流,创建测试直播间,已经检测并发性能,安装步骤参考GitHub说明,推流如下:
./objs/sb_rtmp_publish -i doc/demo.flv -c 1 -r rtmp://172.31.12.26:1935/hls/99999