SRS是一款国产的开源流媒体服务器,支持RTMP、SRT等主流直播协议。本文讲解如何通过 SRS 与ffmpeg 实现 SRT 协议的推流功能。

SRS在编译和启动的时候已经默认支持SRT,查看SRS专用于SRT服务的配置文件srt.conf,找到srt部分的配置信息如下,可见SRS默认把10080端口分配给SRT协议。

srt_server {
    enabled on;
    listen 10080;
    maxbw 1000000000;
    connect_timeout 4000;
    peerlatency 0;
    recvlatency 0;
    latency 0;
    tsbpdmode off;
    tlpktdrop off;
    sendbuf 2000000;
    recvbuf 2000000;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

除此以外,还需在srt.conf的“vhost __defaultVhost__”节点内部添加下面一行:

gop_cache   on;
  • 1.

该行配置的作用是开启缓存关键帧,实际应用记得设置为on,否则客户端拉流找不到关键帧就无法渲染画面。

接着运行下面命令即可启动专用于SRT协议的SRS流媒体服务器。

cd /usr/local/src/srs/trunk
./objs/srs -c conf/srt.conf &
  • 1.
  • 2.

在SRS启动之后,运行下面的ffmpeg命令即可将视频文件向SRT地址推流。注意,务必确保Linux服务器上的FFmpeg已经集成了libsrt库,否则ffmpeg无法向srt地址推流。

ffmpeg -re -stream_loop -1 -i "/usr/local/src/test/cctv5.ts" -c copy -f mpegts 'srt://127.0.0.1:10080?
streamid=#!::r=live/test,m=publish'
  • 1.
  • 2.

注意,上面命令中的srt地址后半段为“r=live/test,m=publish”,其中“r=live/test”表示SRT的服务名称叫做“live/test”,而“m=publish”表示该地址属于发布功能也就是给推流方使用。

SRS对视频源文件的封装格式也有要求,不仅要求源文件为ts格式,还要求推流格式也为ts格式,所以ffmpeg命令中添加了“-f mpegts”表示转换成mpeg的ts流格式。如果源文件不是ts格式,或者没转成mpegts格式,后续通过ffplay播放srt链接都会报下面的错误。

non-existing PPS 0 referenced
  • 1.

运行ffmpeg的SRT推流命令之后,SRS输出以下的日志信息,可见其SRT推流功能正常运行。

[x7gy1tv8] SRT client ip=127.0.0.1:58898, fd=237547294
[x7gy1tv8] @srt, streamid=#!::r=live/test,m=publish, stream_url=/live/test, vhost=__defaultVhost__, app=live, stream=test, param=
[x7gy1tv8] new srt source, stream_url=/live/test
[x7gy1tv8] new live source, stream_url=/live/test
[x7gy1tv8] ignore disabled exec for vhost=__defaultVhost__
[x7gy1tv8] http: mount flv stream for sid=/live/test, mount=/live/test.flv
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

安装FFmpeg并打开MSYS的命令行,运行下面的ffplay命令,期望从SRT地址拉流播放。注意,务必确保电脑上的FFmpeg已经集成了libsrt库,否则ffplay无法播放srt链接。

ffplay -i 'srt://124.xxx.xxx.xxx:10080?streamid=#!::r=live/test,m=request'
  • 1.

上面的SRT拉流地址与之前的推流地址大同小异,除了把内网IP换成外网IP之外,就是把链接末尾的“m=publish”改成了“m=request”,其中request表示请求也就是用于拉流方。

音视频开发视频推荐:

 C++音视频开发全套进阶教程,让你少走弯路,避免盲目自学。

ffplay运行后弹出播放器窗口,正常播放视频画面和声音。同时观察SRS的服务日志如下所示:

[3p39n49z] SRT client ip=112.5.138.145:51436, fd=237547293
[3p39n49z] @srt, streamid=#!::r=live/test,m=request, stream_url=/live/test, vhost=__defaultVhost__, app=live, stream=test, param=
[3p39n49z] create ts consumer, no gop cache
  • 1.
  • 2.
  • 3.

从以上日志可见,SRS通过SRT协议成功实现了视频直播的SRT推拉流功能。