【问题标题】:FFmpeg RTP network issue in UbuntuUbuntu中的FFmpeg RTP网络问题
【发布时间】:2015-08-14 07:29:50
【问题描述】:

我想从本地文件上使用 RTP 传输的 mpeg 复制一堆 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: drop old packet received too late") 和两个文件(video1.mpg 和 video2.mpg)中都收到了来自第二个来源( rtp://@IP2:PORT)。

此问题仅在 Linux 中出现(我检查了 Ubuntu 14.04 - 16.04)。我在 Windows 中没有问题,并且可以从文件并行正确地转码视频。在 Ubuntu 下,甚至两个调整到不同源的 ffplay 实例也会播放相同的内容(从最后打开的源)。我试过用 VLC 回放,没有这样的问题。

当使用带有 -f 选项的 FFmpeg 时,我可以解决这个问题:
ffmpeg -f mpegts -i rtp://@IP1:PORT -c copy video1.mpg

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

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

【问题讨论】:

  • 你的问题解决了吗?!我得到了 RTP 数据包丢失和图片丢失错误。
  • 使用 udp 到 http 代理 (udpxy) 为我解决了这个问题。
  • 我想在android中运行ffmpeg,所以我想我不能使用udpxy解决方案。您同意增加最大 UDP 缓冲区大小会有所帮助吗?
  • 在我的情况下它没有帮助。

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


【解决方案1】:

更新:

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

sources=address[,address]

仅接收从指定发送方 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

【讨论】:

  • 感谢您的回复。我将 net.core.rmem_max 设置为 26214400。net.core.rmem_max 值为 212992。还尝试更改 net.core.rmem_default 值,不幸的是它没有帮助。
  • 如果两个 ffplay 命令具有 2 个不同的源播放相同的东西,那么您的多播可能有问题。另一端在传输什么?
  • 我正在使用以下命令:ffplay -i rtp://IP1:PORT?sources=SourceIP1 - 一切都很好。然后:ffplay -i rtp://IP2:PORT?sources=SourceIP2 - 在两个窗口中都在播放来自 rtp://IP2:PORT 的视频。当我在第一个窗口中关闭第二个 ffplay 实例时,再次从 rtp://IP1:PORT 播放视频。但我可以在 Ubuntu 中通过 VLC 播放两个不同的视频流(rtp://IP1:PORT 和 rtp://IP2:PORT)。
  • 另外:当我打开两个具有不同 url 的 ffplay 实例(rtp://IP1:PORT?sources=SourceIP1 和 rtp://IP2:PORT?sources=SourceIP2)时,它们播放相同的视频来自 rtp://IP2:PORT。在那一刻,我在 VLC 中打开 url (rtp://IP1:PORT?sources=SourceIP1),VLC 正在播放来自 rtp://IP1:PORT 的视频。
  • @aergistal 你知道这个文件在 Android 源代码中的位置吗?! (在编译AOSP之前,没有包含etc文件夹的输出文件夹;我想在编译之前更改sysctl.conf)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 2013-04-08
    • 2011-03-30
    • 2016-05-14
    • 2017-04-11
    • 2021-09-02
    • 2019-11-15
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多