Ffmpeg 如何通过UDP发送MPEGTS流

Ffmpeg 如何通过UDP发送MPEGTS流,ffmpeg,udp,video-streaming,vlc,mpeg2-ts,Ffmpeg,Udp,Video Streaming,Vlc,Mpeg2 Ts,我正在开发一个实时视频流系统,它基本上由一个服务器和几个客户端组成 现在,让我们忽略数据包在服务器和客户端之间的转发方式,只关注服务器如何通过UDP数据包发送MPEGTS流 流以MPEGTS格式编码 我试图做的是读取一些数据包(主要问题是“有多少?”)并将它们封装在UDP数据包中。目的地(客户端)读取这些UDP数据包,然后将其转发给VLC,VLC能够通过读取UDP数据包播放MPEGTS网络流 如果我只发送视频数据包,一切正常,相反,如果我尝试将一些视频数据包和一些音频数据包封装在同一个UDP数据

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

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

流以MPEGTS格式编码

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

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

以下是我的程序的示例代码:

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

谢谢

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

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

即使您将数据分成大小刚好合适的数据包,并以正确的速率发送数据包,其中一些数据包仍将丢失、复制或无序发送。您的代码必须处理所有这些条件,否则您不能相信您收到的是您发送的

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

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

您可以试试 它使用ts或FIFO文件并发送恒定比特率流

重要功能列表:

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

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

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

  • 使用FIFO文件

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


嗨,赛斯,非常感谢你的建议。我知道我应该处理一些在真实环境中经常发生的问题。现在我正在一个实验环境(一个强大的本地机器)中做一些测试,以便找到一种好的方式来解码/编码数据包并创建UDP流。在这种情况下,我认为我不太可能在本地机器上丢失数据包。这意味着问题与“如何在UDP数据包中封装视频/音频数据包”有关。有什么建议吗?如果数据包发送得太快、太大、本地防火墙正在运行或者操作系统感觉像这样,那么数据包可能也将在本地计算机上丢失。UDP永远不可靠,除非您使其可靠。对于封装,您将需要一个报头来至少标识数据包的顺序,以便能够缓冲和重新排序数据包和/或检测丢失。将大小降低到不超过1408字节,包括标头。如果不同的数据包可能包含不同的数据组合,则向标头添加描述性信息。不要想当然。-1,你的答案适用于udp的一般传输。但这个问题与MPEG-TS有关。MPEG-TS用于单向通信且无法进行重传的情况,如卫星通信或多播udp。数据包丢失在这里不是什么大问题。TS数据包中有一个简单的校验和来检测错误。然后我们就可以丢弃数据并重新同步。那么你建议用什么来代替UDP进行视频传输呢?!如果是RTP,我在Android中进行实时视频流,因此没有RTP播放器(我还没有找到)。视频传输有三种广泛的选择:编写自己的TCP,编写自己的UDP,或者使用RTP之类的工具包(通常基于UDP)。但是,如果您是从头开始构建,那么捕获和回放与传输是不同的问题。专有工具包(如QuickTime或WMP)倾向于将这三者结合起来,并试图迫使您从端到端使用他们的软件。即使他们可能使用RTP,他们也不提供API来进入RTP。最简单的方法:找到一个你可以负担得起的端到端包。请注意,vlc有一个漏洞,如果url中没有
@
,它通常不会播放udp流,尽管url没有用户名/密码。话虽如此,由于udp数据包中容纳的ts数据包不超过8 188字节,因此不能包含更多。(少不成问题)。udp数据包应以ts数据包的开头开始,即第一个字节应为0x47。使用wireshark验证数据。您解决问题了吗?我用dvblast做视频流,用UDP发送数据包,用ffmpeg接收数据包。甚至将UDP数据包大小设置为1316;但我经常遇到错误:“PES数据包大小不匹配”,输出视频很糟糕。