Secure Reliable Transport Protocol SRT协议

最近,在研究低延迟视频传输课题时接触到了SRT协议。SRT是一个时下非常受欢迎的开源低延迟视频传输协议。SRT是Secure Reliable Transport的简称。它拥有三大特点,安全,可靠,低延迟。安全方面,SRT支持AES加密,保障端到端的视频传输安全。可靠性方面,SRT通过前向纠正技术(FEC)保证传输的稳定性。低延迟方面,由于SRT建立在UDT协议之上,解决了UDT协议传输延迟高的问题。UDT协议是基于UDP网络通信协议的。SRT解决了复杂的传输时序问题,可以做到支持高吞吐量文件和超清视频的实时传输。GitHub代码

Secure Reliable Transport Protocol SRT协议_第1张图片


虽然SRT在GitHub上公布了源代码,但是我在研究SRT协议的过程中,百度、谷歌基本很难找到开发使用的资料。经过仔细的研究,逐渐实现了SRT协议在不同终端下的文件传输,服务器客户端的视频传输。经过测试,端到端的最大延迟为1秒。经过分析,我发现这么大的延迟并不是SRT协议产生的。主要是客户端在调用ffmpeg协议,生成视频流的过程中,需要进行h264编码,耗费了大量的计算资源,导致产生了1秒的延迟。

实验环境

按照GitHub上的readme,在linux下编译了这个项目。

SRT协议传输文件

发送端
$ ./srt-file-transmit file:///home/master/1.jpg srt://192.168.43.196:5002

接收端
$ ./srt-file-transmit srt://:5002/?mode=listener file:///home/master/

分别在两台电脑(接收端和发送端)的终端下输入上述命令,即可以将/home/master/1.jpg发送到192.168.43.196:5002。第二行的"/home/master/"是文件保存路径。

ffmpeg生成流接收流测试

发送端:
ffmpeg -f lavfi -re -i smptebars=duration=60:size=1280x720:rate=30 -f lavfi -re -i sine=frequency=1000:duration=60:sample_rate=44100 -pix_fmt yuv420p -c:v libx264 -b:v 1000k -g 30 -keyint_min 120 -profile:v baseline -preset veryfast -f mpegts "udp://127.0.0.1:1234?pkt_size=1316"
(生成彩色条带视频流)
接收端:
ffplay udp://127.0.0.1:1234
可以显示出彩色条带和播放出滴滴的长鸣声(正弦波的声音)

通过这段代码,可以验证在linux中ffmpeg是否安装完整。

SRT本地回环传输彩色条带

在终端1输入:
ffmpeg -f lavfi -re -i smptebars=duration=60:size=1280x720:rate=30 -f lavfi -re -i sine=frequency=1000:duration=60:sample_rate=44100 -pix_fmt yuv420p -c:v libx264 -b:v 1000k -g 30 -keyint_min 120 -profile:v baseline -preset veryfast -f mpegts "udp://127.0.0.1:5000?pkt_size=1316"
(生成流)

在终端2输入:
./stransmit -r:10 -s:5 udp://:5000 srt://:9000
(发送流)

在终端3输入:
./stransmit srt://127.0.0.1:9000 file://con | ffplay -
(接收流,显示出视频和声音)

SRT局域网传输彩色条带

发送电脑上:

在终端1输入:
ffmpeg -f lavfi -re -i smptebars=duration=60:size=1280x720:rate=30 -f lavfi -re -i sine=frequency=1000:duration=60:sample_rate=44100 -pix_fmt yuv420p -c:v libx264 -b:v 1000k -g 30 -keyint_min 120 -profile:v baseline -preset veryfast -f mpegts "udp://127.0.0.1:5000?pkt_size=1316"
(生成流)

在终端2输入:
./stransmit -r:10 -s:5 udp://:5000 srt://192.168.43.196:9000
(发送流)

接收电脑上:
终端输入:
./stransmit srt://:9000 file://con | ffplay -

SRT本地回环传输TS流视频

在终端1输入:
ffmpeg -r 30 -re -i /dev/video0 -pix_fmt yuv420p -c:v libx264 -b:v 1000k -profile:v baseline -preset ultrafast -f mpegts "udp://127.0.0.1:5000?pkt_size=1316"
(生成流)

在终端2输入:
./stransmit -r:10 -s:5 udp://:5000 srt://:9000
(发送流)

在终端3输入:
./stransmit srt://127.0.0.1:9000 file://con | ffplay -
(接收流,显示出视频和声音)

SRT局域网传输TS流视频

发送PC上:

在终端1输入:
ffmpeg -i /dev/video0 -pix_fmt yuv420p -c:v libx264 -b:v 1000k -g 30 -keyint_min 120 -profile:v baseline -preset veryfast -f mpegts "udp://127.0.0.1:5000?pkt_size=1316"
(将摄像头采集到的生成流)

在终端2输入:
./stransmit -r:10 -s:5 udp://:5000 srt://192.168.43.196:9000
(发送流)

接收PC上:
终端输入:
./stransmit srt://:9000 file://con | ffplay -

 

你可能感兴趣的:(sys)