[rtp/rtcp服务器]如何准备一个存储的媒体文件进行流媒体播放?

[rtp/rtcp server]How to prepare a stored media file for steaming?

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

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

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

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

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

1 秒后,我们将序列号增加 1,将时间戳加 1 秒,将下一个 1 秒的数据添加到有效负载并发送下一个 RTP header.

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

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

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

实际上,如果您想从 A 点到 B 点获取 pre-recorded MP4 文件,有比 RTP 更好的协议,RTP 专注于实时 媒体传输,如 live-streaming 风格,不传输现有 pre-recorded 媒体文件,FTP、HTTP 甚至某些 peer-to-peer 协议更适合传输此文件.