告诉 ffmpeg 丢弃帧以减少内存使用?

告诉 ffmpeg 丢弃帧以减少内存使用?

我正在使用将安全摄像机的实时镜头从 MJPEG 转码为 MPEG2 ffmpeg

不幸的是,进行转码的机器无法跟上(100% CPU 使用率),但它“足够好”,我不介意偶尔丢帧。但由于某种原因,它ffmpeg没有丢帧,因此随着进程落后于传入帧,内存使用量不断增加,然后机器内存耗尽,视频开始严重损坏。

有没有办法ffmpeg更积极地告知丢弃帧?当内存使用量达到 1.9GB 时,就会出现问题,因此我尝试在monit内存超过 1.5GB 时重新启动该过程,但是它每 10 分钟就会重新启动一次,这会破坏每个转码文件的首选 15 分钟长度。

这是我正在使用的命令:

ffmpeg -overrun_nonfatal 1 -y -i udp://1.2.3.4
    -c mpeg2video -b:v 2M -vf transpose=2
    -preset ultrafast -an -r 30
    out.mkv

手册页说该-r选项可以用作丢弃帧的输出选项,但是我这样做了,似乎它只会丢弃帧以匹配输出帧速率(此处为 30fps),而不是丢弃帧以赶上输入流。

-vsync选项看起来也做了类似的事情,试图匹配帧速率而不是最小化缓冲。

-frame_drop_threshold看起来更有希望,但这似乎又是关于丢弃帧以跟上时间戳而不是试图跟上实时编码。

有没有其他选项可以让我根据ffmpeg需要丢弃帧以避免占用太多内存?我想这应该是在实时/流/低延迟选项中,但我似乎找不到任何东西!

答案1

我发现,当我从相机捕获并流式传输全高清视频时,这对我的环境来说是一个问题,当网络遇到瓶颈时,ffmpeg rtbufsize 会很快填满,ffmpeg 开始丢帧。这听起来像是解决您问题的方法。

libavformat 库提供了一些通用的全局选项,可以在所有 muxers 和 demuxersock 上设置:

rtbufsize整数(输入)

    设置用于缓冲实时帧的最大内存。

来源:FFmpeg 格式文档

假设您需要 150 MB 的有限缓冲区,请尝试以下操作:

ffmpeg -rtbufsize 150M -overrun_nonfatal 1 -y -i udp://1.2.3.4 -c mpeg2video -b:v 2M -vf transpose=2 -preset ultrafast -an -r 30 out.mkv

这意味着,当机器无法跟上时,它会开始将传入的数据填充到 RAM 中,从而填满缓冲区,当达到限制时,它将开始大量丢弃帧。

相关内容