OBS采用SRT协议推流
概述安全可靠传输(简称SRT)是一种相对较新的开源流媒体协议,最初由Haivision开发(2013年首次演示),并由SRT联盟推广,该联盟包括流媒体/视频/电信行业的许多大公司。它承诺:
(1) 对网络问题(抖动、丢失的数据包、延迟、带宽波动)具有更好的恢复能力,具有数据包恢复机制(重传或ARQ自动重发请求);以及FEC前向纠错技术和网络连接技术
(2) 低延迟(低至编码器和摄取服务器之间往返行程的两倍,通常为次秒延迟)。
有关视频演示,请参见此处:
SRT目前主要用于广播和企业界。参见NAB 2018 SRT小组,ESPN、NFL、微软演讲者谈论他们对SRT的使用:
NAB 2019 NAB SRT面板可在此处观看:https://www.haivision.com/resources/webinars/broadcast-panel. (嘿,Haivision,友好的建议:最好能把这段视频发布到YouTube上,而不必输入个人信息!:(P)
与RTMP不同,SRT是一个开源协议,源代码可以在GitHub上找到。虽然RTMP开发自2012年以来已被放弃,但SRT开发仍然非常活跃。
作为一种协议,它与内容无关,尽管业界将其与MPEGTS容器一起使用,MPEGTS容器是广播行业事实上的标准(相比之下,RTMP协议依赖于FLV容器),MPEGTS容器通常与UDP协议一起使用,这使得RTMP协议的速度很快,但非常不可靠,并且容易发生丢包。它还可以与TCP一起使用,TCP更可靠,但延迟更大。SRT将这两个协议结合起来传输MPEGTS,具有两个优点:TCP的可靠性和UDP的较低延迟。它还支持加密和绑定。
其他竞争的新协议有WebRTC、Zixi(封闭源代码)和RIST;后两者与SRT非常相似,都超越了RTMP。
关于更多技术细节,我们推荐Twitch工程师Alex Converse的视频:
这里还有一份白皮书
或者在那里。这个API在GitHub上有完整的文档记录。
----------------------------------------------------------------------------------
SRT可以与Twitch或我最喜欢的服务一起使用吗?
简而言之:不能(或者还不能?)
服务
------------------------------------------------------------------------------------
长话短说:没有一个主流流服务支持SRT协议来接收数据。大多数人仍然使用RTMP(Twitch,YouTube,Facebook…)(不过,Mixer通过OBS已经支持的专有FTL协议依赖于WebRTC。如果您仅使用这些服务,则无需进一步阅读。
在采用SRT协议的这个阶段,如果您想使用SRT,就必须有技术倾向。如果您能够设置自己的流媒体服务器,可能会将您的流重定向到主要服务,如Twitch或YouTube,并且对通过提高网络弹性实现低延迟感兴趣,请继续阅读。
另一类可能感兴趣的用户显然属于专业广播行业。这个wiki条目可以被认为是相当高级的,因为它需要访问服务器并能够进行设置。
OBS本身的配置从简单到中等难度不等。服务器设置更具挑战性,因为它需要系统/网络管理知识。
编码器
-----------------------------------------------------------------------------------
实时软件编码器:
FFmpeg,
OBS Studio依靠FFmpeg库,
vMix,
srt live transmit(这是libsrt开发人员的演示应用程序;需要从源代码编译)
Larix Broadcaster和Larix Screencaster可以从Android和iOS上播放SRT。Larix对讲功能允许接收SRT音频反馈到移动设备。
CameraFi Live(仅限Android)。
硬件编码器也有不同的供应商。
服务器
--------------------------------------------------------------------------------
以下服务器支持SRT摄取:
Wowza(付费服务)
在RTMP/HLS/DASH中支持SRT摄取和传输/分配
Nimble Streamer(自由、封闭源)
虽然灵活的拖缆名义上是免费的,但它与非免费仪表板一起使用,公平地说,这是非常方便的。但是它也可以在没有仪表板的情况下使用,只需要修改JSON配置文件。
支持SRT摄取和传输/分发到RTMP、SRT、NDI、MPEG-DASH、HLS、低延迟HLS等。
SRT Live Server(免费、开源)
此选项仅服务于SRT流,不转换为HLS/RTMP/DASH。在这个阶段,它比其他服务器要简单得多,但它是自由/开源软件,在我们的测试中可以与OBS-Studio配合使用。
此外,虽然从技术上讲它不是服务器,但FFmpeg可以在侦听器模式下用于摄取SRT流。它不能像真正的服务器那样为流提供服务。但是它可以被用来转换到RTMP,然后路由到nginx RTMP,然后nginx RTMP可以处理到Twitch/YouTube/Facebook/etc的摄取。
例如:ffmpeg -i srt://IP:port?mode=listener -c copy -f flv rtmp://IP:1935/app/streamName。
同样,srt live transmit可以用来监听srt(或udp)流并中继到最终的srt URL。
例如:srt实时传输srt://IPsrc:端口srt://IPdest:端口。
播放器
--------------------------------------------------------------------------------------------
以下播放器可用于观看SRT流:
VLC(Mac/Linux上的版本3.0+,Windows上的版本4.0+)
ffplay(ffmpeg工具的一部分)
OBS Studio媒体源(一个明显的用法是从任何SRT源广播到OBS实例)。
Haivision Play Pro-iPhone和Android。
用于Android、iOS、Android TV和tvOS的Larix播放器。
在OBS内接收srt流
这对于两个pc设置可能很有用(尽管NDI可能是更常见的解决方案)。
在媒体源中,取消选中“本地文件”。
对于“输入”,输入srt URL。如果从服务器接收到流(在listemer模式下),srt连接将处于mode=caller模式(这是默认模式,因此可以省略该选项)。但是,如果流直接从调用者模式下的编码器接收,则将mode=listener添加到URL(参见屏幕截图)。
对于“输入格式”,输入mpegts。
VLC使用
在此处下载VLC 3.0或VLC 4.0(警告:这是VLC的开发版本)。
如果您只想在不干扰当前VLC安装的情况下进行测试,我们建议您下载一个可移植安装(zip)。
进入媒体>打开网络流:
输入具有以下格式的srt://IP:port。
ffplay 使用
需要使用libsrt支持编译ffplay。据我们所知,虽然没有许可证限制,但似乎没有任何这样的二进制文件可以广泛使用。
只需启动命令行:
ffplay srt://IP:port
如何设置OBS Studio
----------------------------------------------------------------------
有两种设置OBS Studio以连接到服务器的方法。第一种方法比较简单,但目前给出的选择较少。第二种设置有点困难,但提供了更多的微调功能(例如,可以使用muxer选项)。注意:在较旧的Linux发行版中,ffmpeg可能不支持SRT,因此请检查存储库源以确保ffmpeg支持libsrt,因为没有简单的方法可以让OBS Studio引用ffmpeg的定制版本。
注意,虽然讨论的重点是SRT协议,但也可以使用UDP或TCP。
选项1:使用推流输出SRT
--------------------------------------------------------------------------
作者:亚伦·博克瑟,Collabora(SRT联盟)新SRT输出的作者。pkv从头重写的输出(pkv@obsproject.com)解决一些问题。
适用于:Wowza、Nimble服务器、vlc、ffmpeg、srt live服务器、Makito X解码器(这些只是我们在obs项目中测试的平台;大多数都可以正常工作。)
转到“设置”>“流”
在Service drowdown中,选择Custom。
按以下格式输入SRT URL:srt://IP:port(OBS Studio也将接受任何依赖MPEGTS容器并受FFmpeg支持的协议,因此包括UDP、TCP、RTP等)
不要为密钥输入任何内容。它没有被使用。
OBS Studio将接受以下语法中的选项:srt://IP:port?option1=value1和option2=value2。完整的选项列表是FFmpeg支持的选项:http://ffmpeg.org/ffmpeg-protocols.html#srt.
最重要的选项是以微秒为单位的延迟(μs) 是的。默认值为120 ms=120 000μs,应至少为2.5*(编码器和摄取服务器之间的往返时间,单位为ms)。
例如:对于1秒的延迟,将延迟设置为1000000。
另一个有时需要的选项是mode,它可以是caller、listener或rendez-vous。调用者打开客户端连接。侦听器启动服务器来侦听传入的连接。rendezvous使用Rendez-Vous连接模式,这是一种双向链路,第一个发起握手的人被认为是呼叫者。默认值是caller,通常不需要为OBS Studio设置,因为它通常处于caller模式。
在向VLC发送流时,将模式设置为listener很有用。OBS Studio然后充当VLC的服务器,VLC是客户端。例如,在局域网上,将OBS Studio设置为srt://127.0.0.1:port?mode=建立指向VLC的连接的侦听器srt://127.0.0.1:端口。
已知问题:
在v25中,MPEGTS muxer的一个bug使流不完全符合MPEGTS规范。在这种情况下,当将SRT转换到SRT/MPEGTS组合以外的另一个协议/容器时,SRT解码失败。例如,灵活的拖缆和Makito X解码器就是这样。因此,MPEGTS流的转储会创建一个不一致的文件(这可能是通过使用FFmpeg进行重排来修复的)。
在obsv26中修复了PR:pr2665中的错误。使用obs版本>=26。
选项2:使用自定义FFmpeg记录输出SRT流
-----------------------------------------------------------------------
这个选项有点复杂。它依赖于高级:自定义FFmpeg录制输出。
适用于:Wowza、Nimble server、vlc、ffmpeg、srt live server(这些只是我们在obsproject测试的平台;大多数都可以正常工作)。与Haivision的Makito X解码器配合不好。
转到“设置”>“输出”
在“输出模式”下拉列表中,选择“高级”。
单击录制选项卡。
在类型下拉列表中,选择自定义输出(FFmpeg)
在FFmpeg输出类型下拉列表中,选择输出到URL
在文件路径或URL框中,键入SRT URL:srt://IP:port(使用语法输入延迟等选项)srt://IP:port?option1=value1和option2=value2)。
有关其中一些选项的列表和讨论,请参阅上一节或参考FFmpeg文档:http://ffmpeg.org/ffmpeg-protocols.html#srt.
在“容器格式”下拉列表中,选择“mpegts”。
Muxer设置可以留空,也可以将MPEGTS FFmpeg Muxer选项与以下语法option1=value1 option2=value2一起使用(option=value对必须用空格分隔)。
其他设置是不言自明的。选中“显示所有编解码器”框以显示FFmpeg可用的所有编解码器。
请注意,可以选择多个音频曲目。它们可以在摄取服务器端通过所谓的PID来识别。默认值下,视频曲目的pid为0x100(=256),其他音频曲目的pid为0x101等。如果需要更改曲目的pid,请在7中使用muxer选项MPEGTS\u start\u pid。
已知问题:
Makito X解码器可能有问题(在调查中)使用选项1的Makito X解码器。
与方案1相比的利弊:
赞成的意见:
可以自定义MPEGTS muxer选项(例如:设置视频和音频曲目的pid)。
可以播放多个音频曲目(例如,曲目1:主曲目、曲目2:背景音乐、曲目3:评论等),而在选项1中只能选择一个曲目。OBS Studio最多支持6首音频曲目。
反对的意见:
设置更复杂。
不能记录流,因为要利用流的记录输出。
设置示例
中继服务到Twitch
-------------------------------------------------------------------------------------
可以使用ffmpeg轻松地将输入SRT流中继到与Twitch兼容的标准RTMP(甚至是其他流媒体服务提供商,如YouTube或Facebook)。如果OBS和服务之间的连接不好且不稳定,这一点尤其有趣。请注意,您使用的服务器应该有一个快速可靠的连接,以从中获益(但通常是这样)。还要注意的是,使用服务器代理流会消耗大量带宽(考虑是视频流带宽的两倍),而且在Amazon、GCS或Digital Ocean等提供商上,这可能会非常昂贵(不过,它不需要快速的CPU,它只需要接收、重写RTMP和发送)。
如果您为其他人准备服务器,这种方法的优点是非常容易在OBS端进行设置。
例如,可以在服务器上使用以下命令:
ffmpeg -i srt://:1234?mode=listener&transtype=live&latency=3000000&ffs=128000&rcvbuf=100058624 -c copy -f flv rtmp://live-cdg.twitch.tv/app/streamKey
在此命令中,您可以更改:
1234:这是SRT服务器使用的侦听端口。您需要将流发送到此端口。它可以是任何东西,只要ffmpeg可以绑定到它。
延迟=3000000:以微秒为单位的延迟。这里我们使用3000毫秒(3秒)。这是一个简单的演算:它越高,如果您丢弃数据包或延迟增加,那么它就越可靠,并且您的查看器将不得不等待更多时间来接收您的帧。它越低,对连接问题就越敏感,但是你的观众也会更快地接收到你的内容。
ffs和rcvbuf是表示不同缓冲区大小的复杂数字。基本上,当您增加延迟时,您需要增加这些值(因为SRT需要在内存中存储更多的内容,以便以后重新组合拼图)。您可以在此处获得有关如何计算这些值的信息:https://github.com/Haivision/srt/issues/703#issuecomment-495570496
live-cdg.twitch.tv:最近的twitch摄取服务器。换到最近的一个:抽搐摄取信息
这是你的Twitch.tv流键。你将需要它来取代这个与你的,让他们知道谁是流到哪里。不要泄漏它,任何人都可以用这个密钥流到您的帐户。
在OBS上,您只需将流设置配置为“自定义”,并使用以下模板指定服务器:
srt://ipofyourserver:4444
您可以将流密钥留空,您不需要它。
运行上面看到的ffmpeg命令,它将无限期地等待输入流,并在流结束时自动停止。我让你选择用systemd或者Docker容器来管理重启!
页:
[1]