前言
现在各大云厂商都支持上行 srt推流,利用 srt的低延迟、快速重传的特性减少用户卡顿和直播延迟。OBS Stuido 25.0 版本之后也支持了srt推流。这篇文章通过srs流媒体服务器和obs studio搭建一个srt的推拉流测试环境。
OBS 是通过 FFmpeg的 libavformat 来支持 SRT。FFmpeg提供 libsrt的封装,option配置方面支持的比较全面。但是 FFmpeg avio接口设计上缺少对统计信息的支持,libsrt 的统计信息全部丢失。注意 FFmpeg libavformat对 libsrt的封装没有考虑双向传输的场景,丢失了双向传输的能力。
OBS 推流srt原理和录制 ts 本地视频原理一致,只是输出的地址一个是网络地址,一个是本地磁盘路径。
推 SRT 流使用的 output id: ffmpeg_mpegts_muxer
详细内容请参考这篇blog:ffmpeg_muxer 视频的录制(flv-mp4-ts-srt-udp-tcp)
srt协议简介
Secure Reliable Transport(简称 SRT)是一种相对较新的开源流媒体协议,最初由 Haivision 开发(2013 年首次演示)并由SRT 联盟推广,该联盟包括流媒体/视频/电信行业的许多大玩家。它承诺:
(1) 通过数据包恢复机制(重传或 ARQ 自动重复请求;以及 FEC 前向纠错)+ 互联网绑定和
(2) 低延迟(低至编码器和摄取服务器之间往返的两倍,通常具有亚秒级延迟)。
SRT git 仓库 : https://github.com/Haivision/srt
SRT 联盟官网:https://www.srtalliance.org/
具体的 srt协议细节参考文章最后列出的参考链接。
obs 配置srt推流
srt的配置示例
srt的推拉流地址
符合yaml格式,以#!::为开始。
key为h,表示vhost和appname/stream;
key为m,表示推流(publish)/拉流(request);
//推流地址格式
srt://127.0.0.1:10080?streamid=#!::h=live/livestream,m=publish
//拉流地址格式
srt://127.0.0.1:10080?streamid=#!::h=live/livestream,m=request
srs流媒体服务器配置srt服务
第一步 拉取srs项目源码
git clone https://github.com/ossrs/srs
cd srs/trunk
第二步 编译srs支持srt推拉流服务
./configure --srt=on && make
第三步 编写SRS配置文件
将以下内容保存为文件,譬如conf/srt.conf,服务器启动时指定该配置文件(srs的conf文件夹有该文件)。
# conf/srt.conf
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
srt_server {
enabled on;
listen 10080;
}
vhost __defaultVhost__ {
}
第四步 启动SRS
./objs/srs -c conf/srt.conf
播放 srt 流
请确保 ffmpeg 支持 libsrt
编译的 ffmpeg 要支持 libsrt –enable-libsrt
可以使用 ffplay播放 srt流
播放命令
ffplay srt://127.0.0.1:10080?streamid=#!::h=live/livestream,m=request
ffmpeg 推拉流 srt
ffmpeg 拉流转推 srt -> rtmp
ffmpeg -i srt://127.0.0.1:10080?streamid=#!::h=live/livestream,m=request -c copy -f flv rtmp://live-cdg.twitch.tv/app/streamKey
ffmpeg 推流 srt, 注意 srt 封装的是 ts 格式的容器。需要指定容器格式 -f mpegts
ffmpeg -re -i ./doc/source.flv -c copy -f mpegts 'srt://127.0.0.1:10080?streamid=#!::h=live/livestream,m=publish'
总结
整个 srt 推拉流的环境的搭建还是比较容易,接下来可以通过 Wireshark 抓包配合 srt 的白皮书学习协议的具体细节。
以上都是个人工作当中对obs-studio开源项目的理解,难免有错误的地方,如果有欢迎指出。
若有帮助幸甚。
技术参考
1.本文部分技术点出处:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
2.使用 SRT 协议进行流式传输: https://github.com/obsproject/obs-studio/wiki/Streaming-With-SRT-Protocol
3.srs SRTWiki :https://github.com/ossrs/srs/wiki/v4_CN_SRTWiki
4.技术解码 | SRT和RIST协议综述
5.SRT协议在电视直播中的应用:https://www.bilibili.com/video/BV1xV411a7BW
6.新一代直播传输协议SRT: https://mp.weixin.qq.com/s/P4cbRxJnXlkQOtXNkdDL4w