0

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

4

1 回答 1

1

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

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

假设您有一个 10 秒的 MP4 文件,并且您决定您的分包计时器为 1 秒,我们会将其拆分为 10x 1 秒长的数据块,我们可以将其放入我们的 RTP 有效负载中。(在实践中,您可以使用FFMPeg 或类似的东西将 MP4 分成 1 秒的块

然后我们形成我们的 RTP 标头,我们将 Payload Type 设置为自定义,因为IANA 分配的 MP4 数据没有有效负载类型。我们会分配一个起始序列号、一个同步源标识符和一个时间戳,然后我们会用前 1 秒的数据填充有效负载。

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

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

如果你真的想实现这个,我写了这个简单的 Python 库来创建 RTP 数据包

要了解有关 RTP 的更多信息,显然有 RFC 3550,要真正深入了解 RTP ,Colin Perkins 有一本很棒的书,名为“RTP:Internet 的音频和视频”我写了一些关于所有 RTP 标头及其意义。

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

于 2019-09-24T01:12:41.320 回答