【发布时间】:2020-01-17 20:56:28
【问题描述】:
现在我正在尝试了解 rtp/rtcp 协议 (RFC3550)。 我知道在一般情况下,音频和视频流是分开的。 但是,如果我想在服务器中播放存储的媒体文件(例如 *.mp4), 服务器如何从该媒体文件中获取这些曲目?
【问题讨论】:
现在我正在尝试了解 rtp/rtcp 协议 (RFC3550)。 我知道在一般情况下,音频和视频流是分开的。 但是,如果我想在服务器中播放存储的媒体文件(例如 *.mp4), 服务器如何从该媒体文件中获取这些曲目?
【问题讨论】:
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 甚至某些点对点协议更适合传输。
【讨论】: