如何通过UDP发送MPEGTS流

pAk*_*Y88 5 udp ffmpeg vlc video-streaming mpeg2-ts

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

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

流以MPEGTS格式编码。

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

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

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

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

谢谢!

Set*_*ble 3

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

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

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

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

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

  • -1,你的答案适用于udp的一般传输。但这是关于 MPEG-TS 的问题。MPEG-TS 用于单向通信且不可能重传的情况,例如卫星通信或多播 udp。丢包在这里没什么大不了的。TS 数据包中有一个简单的校验和来检测错误。然后我们可以丢弃数据并重新同步。 (6认同)
  • 如果数据包发送得太快、太大、本地防火墙正在运行或者操作系统感觉如此,则数据包可能并且将会在本地计算机上丢失。除非您使其可靠,否则 UDP“永远不会”可靠。对于封装,您将需要一个标头来至少识别数据包的排序,以便您可以缓冲和重新排序它们和/或检测丢失。将大小控制在不超过 1408 字节,包括标头。如果不同的数据包可能包含不同的数据组合,请在标头中添加描述性信息。没有什么是理所当然的。 (3认同)