2015-08-14 63 views
1

我想从本地文件上用RTP传输的mpegts复制一堆SD源。 (VBR mpeg2video,mp2音频)。它工作正常的一个组播源用下面的命令:Ubuntu中的FFmpeg RTP网络问题

ffmpeg -i rtp://@IP1:PORT -c copy video1.mpg 

但是当我跑了第二ffmpeg的情况下使用下面的命令:

ffmpeg -i rtp://@IP2:PORT -c copy video2.mpg 

然后我得到了来自FFmpeg的情况下错误(” RTP:丢弃收到的旧数据包太晚“),并在两个文件(video1.mpg和video2.mpg)中录制来自第二个来源(rtp:// @ IP2:PORT)的视频。

这个问题只发生在Linux(我查了Ubuntu 14.04 - 16.04)。我在Windows中没有问题,并且可以正确地从文件并行转码视频。在Ubuntu下,即使两个调谐到不同来源的ffplay实例也会播放相同的内容(来自最后打开的来源)。我试着用VLC回放,没有这样的问题。

我可以使用FFmpeg的使用-f选项时解决此问题:
ffmpeg的-f MPEGTS -i RTP:// @ IP1:PORT -c复制video1.mpg

ffmpeg的-f MPEGTS -i rtp:// @ IP2:PORT -c复制video2.mpg,但后来出现以下错误:“[mpegts @ 0x306e240] PES数据包大小不匹配”并接收这两个文件(video1.mpg和video2 .mpg)与工件和冻结效果。两个操作系统都会出现此问题。

如何在Ubuntu下同时在多个RTP流中使用FFmpeg对视频进行编码转换,而不会出现错误和伪像?

+0

你解决你的问题?我得到了RTP包丢失,并且图片丢失了错误。 –

+1

使用udp到http代理(udpxy)为我解决了这个问题。 –

+0

我想在android中运行ffmpeg,所以我想我不能使用udpxy解决方案。你同意增加最大UDP缓冲区大小可以帮助吗? –

回答

3

更新:

如果使用多播组,您可能需要设置sources参数接收来自指定地址发送的报文。

源地址= [,地址]

仅接收来自发送方指定的IP地址中的一个发送到多播组的数据包。

ffmpeg -i rtp://[multicast-address]:port?sources=xxx


这很可能是你的Linux机器上造成的undersized receive buffer。既然你提到SD,它必须设置的很低。

可以以字节获得当前值:

sysctl net.core.rmem_max

,并设置一个新值:

sysctl -w net.core.rmem_max=26214400

或编辑/etc/sysctl.conf

+0

感谢您的回复。我将net.core.rmem_max设置为26214400. net.core.rmem_max的值为212992.还尝试更改net.core.rmem_default的值,但不幸的是这没有帮助。 –

+0

如果两个带有2个不同源的'ffplay'命令发挥相同的作用,那么你的组播可能有问题。另一端有什么传输? – aergistal

+0

更新了答案 – aergistal

0

这是不是最好的解决方案,但可以解决此问题。
我跑udpxy如下:udpxy -p 5556
然后运行下列方式的ffmpeg:ffmpeg -i http://0.0.0.0:5556/rtp/239.255.1.1:5044