我正在开发一个实时视频流系统,它基本上由服务器和几个客户组成。
现在,让我们忽略如何在服务器和客户端之间转发数据包,让我们只关注服务器如何通过UDP数据包发送MPEGTS流。
流以MPEGTS格式编码。
我正在尝试做的是读取一些数据包(主要问题是“有多少?”)并将它们封装在UDP数据包中。目标(客户端)读取这些UDP数据包,然后将它们转发到VLC,VLC能够通过读取UDP数据包来播放MPEGTS网络流。
如果我只发送视频数据包,一切正常,相反,如果我尝试封装相同的UDP数据包,包括一些视频数据包和一些音频数据包,VLC无法解码和播放流。 我在某处读到每个UDP数据包应包含7个TS数据包,但遗憾的是,即使我遵守此规则,VLC也无法正确解码数据流。
以下是我的计划的示例代码:http://pastebin.com/evMi6FkY
我应该如何将MPEGTS数据包封装在UDP数据包中?
谢谢!
答案 0 :(得分:2)
您的问题是:“让我们忽略如何在服务器和客户端之间转发数据包”。
UDP要求您处理网络传输的所有问题,包括流量控制,错误检测和恢复,路径最大传输单元大小,打包,缓冲,序列化,重复数据删除等。
即使您将数据分成大小合适的数据包并以合适的速率发送,有些仍会丢失,重复或无序传送。您的代码必须处理所有这些条件,否则您不能相信您收到的内容就是您发送的内容。
在这种特殊情况下,我猜你的数据包已经变得太大,导致碎片和高丢弃率。一般来说,每个数据包最好不要超过1400个字节。但是,错误的排序,丢失和重复都是可能的,并且当您尝试发送更大量的数据时,所有这些都变得更有可能。
免责声明:我在一家生产商业UDP数据传输软件的公司工作。
答案 1 :(得分:0)
您可以尝试https://github.com/KwikFlixTV/kwik-udp-send 它使用ts或FIFO文件并发送恒定比特率流。
重要功能列表:
将ts文件作为ts udp流发送
如果没有要发送的文件,它会发送空数据包
使用实时进程/线程优先级来提供流的稳定性
使用FIFO文件
使用累积部件将文件读取到缓存缓冲区以提供流的稳定性