我想从mpegts复制一堆SD源,并在本地文件上使用RTP传输。(VBR mpeg2video,mp2音频)。对于一个多播源,使用以下命令可以很好地工作:
ffmpeg -i rtp://@IP1:PORT -c copy video1.mpg但是,当我使用以下命令运行第二个ffmpeg实例时:
ffmpeg -i rtp://@IP2:PORT -c copy video2.mpg然后,我从第二个源(rtp://@IP2 2:PORT)记录的两个FFmpeg实例("RTP:丢弃旧数据包太晚了“)和两个文件(视频1.mpg和video 2.mpg)中获得了错误。
此问题仅在Linux中发生(我查看了Ubuntu14.0416.04)。我在Windows中没有任何问题,我可以从文件中正确地转换视频。在Ubuntu下,甚至有两个调到不同源的ffplay实例回放相同的内容(来自上次打开的源代码)。我试着用VLC回放,没有这样的问题。
在使用FFmpeg和-f选项时,我可以解决这个问题:
-f mpegts -i rtp://@IP1 1:端口-c复制视频1.mpg
和
ffmpeg -f mpegts -i rtp://@I 2:端口-c复制视频2.mpg,但随后我得到以下错误:"mpegts @ 0x306e240 PES数据包大小不匹配“,并接收带有工件和冻结效果的两个文件(视频1.mpg和mismatch 2.mpg)。这两个操作系统都会出现此问题。
如何在Ubuntu下用FFmpeg记录来自多个RTP流的视频,没有错误和工件?
发布于 2015-08-14 08:38:06
更新:
如果使用多播组,则可能需要设置sources参数以接收从指定地址发送的数据包。
sources=address,地址 只接收从指定的发送方IP地址之一发送到多播组的数据包。
ffmpeg -i rtp://[multicast-address]:port?sources=xxx
这很可能是由您的Linux机器上的小尺寸接收缓冲器引起的。既然你提到了SD,它必须被设置得相当低。
可以使用以下方法获得当前值(以字节为单位):
sysctl net.core.rmem_max
并使用以下方法设置一个新值:
sysctl -w net.core.rmem_max=26214400
或编辑/etc/sysctl.conf
发布于 2016-03-22 07:58:04
这不是最好的解决办法,但可以解决这个问题。
我按照以下方式运行udpxy:udpxy -p 5556
然后以以下方式运行ffmpeg:ffmpeg -i http://0.0.0.0:5556/rtp/239.255.1.1:5044
https://stackoverflow.com/questions/32004598
复制相似问题