6

我正在开发一个实时视频流系统,它基本上由一个服务器和几个客户端组成。

现在,让我们忽略数据包是如何在服务器和客户端之间转发的,让我们只关注服务器如何通过 UDP 数据包发送 MPEGTS 流

流以 MPEGTS 格式编码。

我要做的是读取一些数据包(主要问题是“多少?”)并将它们封装在 UDP 数据包中。目的地(客户端)读取这些 UDP 数据包,然后将它们转发给 VLC,VLC 能够通过读取 UDP 数据包来播放 MPEGTS 网络流。

如果我只发送视频数据包,一切正常,相反,如果我尝试将一些视频数据包和一些音频数据包封装在同一个 UDP 数据包中,VLC 将无法解码和播放流。我在某处读到每个 UDP 数据包应包含 7 个 TS 数据包,但不幸的是,即使我遵守此规则,VLC 也无法正确解码流。

这是我的程序的示例代码:http: //pastebin.com/evMi6FkY

我应该如何将 MPEGTS 数据包封装在 UDP 数据包中?

谢谢!

4

2 回答 2

3

您的问题是:“让我们忽略数据包在服务器和客户端之间的转发方式”。

UDP 要求您处理网络传输的所有问题,包括流量控制、错误检测和恢复、路径最大传输单元大小、打包、缓冲、序列化、重复数据删除等。

即使您将数据分成大小合适的数据包并以合适的速率发送,一些数据仍然会丢失、重复或乱序传送。你的代码必须处理所有这些条件,否则你不能相信你收到的就是你发送的。

在这种特殊情况下,我猜你的数据包已经变得太大,导致碎片和高丢弃率。一般来说,每个数据包最好不要超过 1400 字节左右。但是不正确的排序、丢失和重复也都是可能的,并且当您尝试发送大量数据时,所有这些都变得更有可能。

免责声明:我在一家生产商业 UDP 数据传输软件的公司工作。

于 2012-06-04T19:29:28.397 回答
0

您可以尝试https://github.com/KwikFlixTV/kwik-udp-send 它使用 ts 或 FIFO 文件并发送恒定比特率流。

重要功能列表:

  • 将 ts 文件作为 ts udp 流发送

  • 如果没有要发送的文件,则发送空包

  • 与实时进程/线程优先级一起使用以提供流的稳定性

  • 适用于 FIFO 文件

  • 将文件读取到带有累积部分的缓存缓冲区以提供流的稳定性

于 2015-12-24T06:56:38.770 回答