【问题标题】:[rtp/rtcp server]How to prepare a stored media file for steaming?[rtp/rtcp server]如何准备一个存储的媒体文件进行流式传输?
【发布时间】:2020-01-17 20:56:28
【问题描述】:

现在我正在尝试了解 rtp/rtcp 协议 (RFC3550)。 我知道在一般情况下,音频和视频流是分开的。 但是,如果我想在服务器中播放存储的媒体文件(例如 *.mp4), 服务器如何从该媒体文件中获取这些曲目?

【问题讨论】:

    标签: rtp rtcp


    【解决方案1】:

    RTP 是关于传输实时数据的,如何将其分解并放入 RTP 数据包有效负载(称为“打包”)取决于实施者,但让我们看一个常见的用例,你如何' d 实际上是这样做的。

    如果您想通过 RTP 流发送现有录制的 MP4 文件,您首先需要将其分成更小的块,然后以固定的时间间隔通过网络发送到 RTP 数据包中。

    假设您有一个 10 秒的 MP4 文件,并且您决定您的分包计时器为 1 秒,我们会将其拆分为 10x 1 秒长的数据块,我们可以将其放入我们的 RTP 有效负载中。 (实际上你可以使用FFMPeg or something similar to split the MP4 into 1 second chunks

    然后我们形成我们的 RTP 标头,我们将 Payload Type 设置为自定义的东西,如 there's no payload type for MP4 data assigned by IANA. 我们将分配一个起始序列号、一个同步源标识符和一个时间戳,然后我们将使用以下内容填充有效负载前 1 秒的数据。

    1 秒后,我们将序列号加 1,将 1 秒添加到时间戳,将接下来 1 秒的数据添加到有效负载并发送下一个 RTP 标头。

    然后我们会再重复 8 次,直到我们发送了 10 个包含 10x 1 秒 MP4 有效负载的 RTP 数据包。

    如果你真的想实现这个,我写了这个simple Python Library for creating RTP packets

    要了解有关 RTP 的更多信息,请访问 obviously RFC 3550,要深入了解 RTP,请访问 great book by Colin Perkins called "RTP: Audio and Video for the Internet"I've written a bit about all the RTP headers and their meaning.

    实际上,如果您想从 A 点到 B 点获取预先录制的 MP4 文件,则有比 RTP 更好的协议,RTP 专注于媒体的实时传输,如实时流式传输,不传输现有的预先录制的媒体文件,FTP、HTTP 甚至某些点对点协议更适合传输。

    【讨论】:

    • 感谢您这么详细的回复!我尝试为流存储文件实现一个迷你 rtp 服务器。有很多东西需要学习,比如H264有效载荷格式,mp4容器等等......似乎这是一项漫长而艰难的工作:D
    • 如果没有限制,为什么不使用开源实现。
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2012-07-23
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多