Ubuntu

时间:2015-08-14 07:29:50

标签: ubuntu ffmpeg network-programming video-streaming rtp

我想从本地文件中使用RTP传输的mpegts复制一堆SD源。 (VBR mpeg2video,mp2音频)。使用以下命令对一个组播源工作正常:

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 copy video1.mpg

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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