如何通过UDP发送MPEGTS流

时间:2012-05-23 15:21:18

标签: ffmpeg udp video-streaming vlc mpeg2-ts

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

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

流以MPEGTS格式编码。

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

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

以下是我的计划的示例代码:http://pastebin.com/evMi6FkY

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:0)

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

重要功能列表:

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

  • 如果没有要发送的文件,它会发送空数据包

  • 使用实时进程/线程优先级来提供流的稳定性

  • 使用FIFO文件

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