​《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开发实战:从零基础到短视频上线》一书。

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

  1. FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  2. FFmpeg开发笔记(四):ffmpeg解码的基本流程详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  3. FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放

    前言   ffmpeg播放rtsp网络流和摄像头流.   Demo   使用ffmpeg播放局域网rtsp1080p海康摄像头:延迟0.2s,存在马赛克     使用ffmpeg播放网络rtsp文件流 ...

  4. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

  5. FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台

    FFmpeg和SDL开发专栏(点击传送门) 上一篇:<FFmpeg开发笔记(九):ffmpeg解码rtsp流并使用SDL同步播放>下一篇:敬请期待   前言   将ffmpeg移植到海思H ...

  6. 网站开发进阶(四十三)html中,路径前加“/” 与不加“/”的区别

    网站开发进阶(四十三)html中,路径前加"/" 与不加"/"的区别 前言 <script src="js/downloadify.js&quo ...

  7. Django开发笔记四

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.邮箱激活 users app下,models.py: ...

  8. Java开发笔记(十三)利用关系运算符比较大小

    前面在<Java开发笔记(九)赋值运算符及其演化>中提到,Java编程中的等号“=”表示赋值操作,并非数学上的等式涵义.Java通过等式符号“==”表示左右两边相等,对应数学的等号“=”: ...

  9. FFmpeg开发笔记(一)搭建Linux系统的开发环境

    对于初学者来说,如何搭建FFmpeg的开发环境是个不小的拦路虎,因为FFmpeg用到了许多第三方开发包,所以要先编译这些第三方源码,之后才能给FFmpeg集成编译好的第三方库.不过考虑到刚开始仅仅调用 ...

  10. .net开发笔记(十三) Winform常用开发模式第一篇

    上一篇博客最后我提到“异步编程模型”(APM),之后本来打算整理一下这方面的材料然后总结一下写篇文章与诸位分享,后来在整理的过程中不断的延伸不断地扩展,发现完全偏离了“异步编程”这个概念,前前后后所有 ...

随机推荐

  1. INFINI Gateway 与华为鲲鹏完成产品兼容互认证

    何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务(含公有云.私有云.混合云.桌面云)推出的一项合作伙伴计划,旨在为构建持续发展.合作共赢的鲲鹏生态圈,通过整合华为的技术.品牌资源,与合作伙伴共享商 ...

  2. koishi常用插件推荐

    今天给大家做一个常用插件的推荐 以下将插件归为几个大类,按类型推荐 1. 日常相关 点歌 插件名:koishi-plugin-music-downloadvoice-api 功能介绍: 语音点歌 - ...

  3. Vue学习:19.插槽实例

    来个简单示例练练手吧. 实例:插槽实例 思路 在封装表格组件时,通常使用默认插槽和作用域插槽来处理固定的自定义结构. 代码 根组件(APP.vue) <template> <div& ...

  4. idea 中的 jrebel

    1.打开idea设置 ,下载 jrebel 2搜索下载jrebel 3.重启之后,在右下角有个弹窗,这时候选择enable,然后右边的侧边栏工具会弹出一个界面,总共应该有4步,第一步是展开的,点击蓝色 ...

  5. Chapter1 p2 vec

    在上一小节中,我们完成了对BMPImage类的构建,成功实现了我们这个小小引擎的图像输出功能. 你已经完成了图像输出了,接着就开始路径追踪吧... 开个玩笑XD 对于曾经学习过一些图形学经典教材的人来 ...

  6. 使用Pytest-xdist库执行分布式跑用例报错:No module named '_pytest.resultlog' 的解决方案

    前言 1.使用库:pytest 6.1.0 2.使用库:pytest-xdist 2.2.0 运行分布式的测试代码: 1 import pytest,time 2 3 def test_01(): 4 ...

  7. 前端React的事件机制

    前端React技术框架的事件机制不同于常见的事件机制--原生事件,此文将介绍React的事件机制是什么,与原生事件的区别,以及这两种事件机制是否可以混用等.希望您在阅读这篇文章之后,能够对React的 ...

  8. 在线RSA签名工具

    在线RSA签名工具支持多种RSA签名算法,包括RSA-MD5.RSA-SHA1.RSA-SHA224.RSA-SHA256.RSA-SHA384和RSA-SHA512.用户只需上传需要签名的数据和私钥 ...

  9. hbase第一课:hbase-2.2.7分布式搭建

    hbase-2.2.7分布式搭建文档 1.上传解压配置环境变量 # 1.解压 tar -xvf hbase-2.2.7-bin.tar.gz.gz # 2.配置环境变量 vim /etc/profil ...

  10. 实测52.4MB/s!全国产ARM+FPGA的CSI通信案例分享!

    CSI总线介绍与优势 CSI(CMOS sensor parallel interfaces)总线是一种用于连接图像传感器和处理器的并行通信接口,应用于工业自动化.能源电力.智慧医疗等领域,CSI总线 ...