科技 > 软件教程 > 媒体工具

FFmpeg开发笔记(四十三)使用SRS开启SRT协议的视频直播服务

68人参与 2024-08-06 媒体工具

《ffmpeg开发实战:从零基础到短视频上线》一书在第10章介绍了轻量级流媒体服务器mediamtx,通过该工具可以测试rtsp/rtmp等流媒体协议的推拉流。不过mediamtx的功能实在是太简单了,无法应用于真实直播的生产环境,真正能用于生产环境的流媒体服务器还要看srs或者zlmediakit。

srs是一款国产的开源流媒体服务器,支持rtmp、srt等主流直播协议,它的安装说明参见之前的文章《linux环境安装srs实现视频推流》。结合srs与ffmpeg实现rtmp协议的推流功能,已在《linux环境安装srs实现视频推流》一文中详细介绍,这里单独讲解如何通过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;
}

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

gop_cache   on;

该行配置的作用是开启缓存关键帧,实际应用记得设置为on,否则客户端拉流找不到关键帧就无法渲染画面。
接着运行下面命令即可启动专用于srt协议的srs流媒体服务器。

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

在srs启动之后,运行下面的ffmpeg命令即可将视频文件向srt地址推流。注意,务必确保linux服务器上的ffmpeg已经集成了libsrt库,否则ffmpeg无法向srt地址推流,详细的集成步骤参见之前的文章《linux环境给ffmpeg集成libsrt和librist》。

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'

注意,上面命令中的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

运行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

然后按照《ffmpeg开发实战:从零基础到短视频上线》一书“1.3  windows系统安装ffmpeg”的介绍,在个人电脑上安装ffmpeg并打开msys的命令行,运行下面的ffplay命令,期望从srt地址拉流播放。注意,务必确保电脑上的ffmpeg已经集成了libsrt库,否则ffplay无法播放srt链接,详细的集成步骤参见之前的文章《windows环境给ffmpeg集成libsrt》。

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

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

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

更多详细的ffmpeg开发知识参见《ffmpeg开发实战:从零基础到短视频上线》。

 

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP

08-06

COG云原生优化遥感影像,瓦片切分的最佳实践

08-06

视频图像色彩增强的主要方法与落地实践

08-06

声网AI降噪测评系统初探

08-06

视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等

08-06

实时音视频入门学习:开源工程WebRTC的技术原理和使用浅析

08-04

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论