gpt4 book ai didi

filter - 如何避免 ffmpeg 内存不足错误

转载 作者:行者123 更新时间:2023-12-04 23:20:51 29 4
gpt4 key购买 nike

我使用带有复杂过滤的ffmpeg。输入是每组 10 到 15 秒长的 FULLHD 监控摄像机视频。集大小(每集的视频数量)各不相同。要删除未更改的帧,我应用 mpdecimate。为了避免被移动灌木触发但仍然保留我想要保留的对象,我应用了一个复杂的过滤器:

  • 分割视频(原始视频和用于检测运动/静止图像的假人)
  • 缩小虚拟对象(因此 mpdecimate 的 8x8 block 度量与我想要保留的移动对象的大小相匹配)
  • 为虚拟对象添加白框以掩盖意外移动的对象
  • 将 mpdecimate 应用于 dummy 以删除不变的帧
  • 将虚拟模型缩放回原始大小
  • 用匹配的原始
  • 帧覆盖 dummy 的剩余帧

    如果输入视频的数量很少(少于 100 个),所有这些都可以正常工作。 ffmpeg 进程的内存消耗在 2GiB 和 5GiB 之间变化。
    如果输入文件的数量变大(比如 200),内存消耗会突然跳到疯狂的数字,直到内存(32GiB 加上 33GiB 交换)用完并且 ffmpeg 被杀死。我无法预测是否以及为什么会发生这种情况。我有一个例子,其中一组 340 个视频使用 6GiB 工作。我尝试过的任何其他超过 100 个视频的集合都会在两分钟内吃掉所有 RAM,然后死掉。
    ffmpeg 没有特定的错误消息。
    dmesg 说:
    Out of memory: Kill process 29173 (ffmpeg)
    Killed process 29173 (ffmpeg) total-vm:66707800kB
    我的 ffmpeg 命令:
    ffmpeg -f concat -safe 0 -i vidlist -vf 'split=2[full][masked];[masked]scale=w=iw/4:h=ih/4,drawbox=w=51:h=153:x=101:y=0:t=fill:c=white,drawbox=w=74:h=67:x=86:y=49:t=fill:c=white,drawbox=w=51:h=149:x=258:y=0:t=fill:c=white,drawbox=w=13:h=20:x=214:y=103:t=fill:c=white,drawbox=w=29:h=54:x=429:y=40:t=fill:c=white,drawbox=w=35:h=49:x=360:y=111:t=fill:c=white,drawbox=w=26:h=54:x=304:y=92:t=fill:c=white,drawbox=w=48:h=27:x=356:y=105:t=fill:c=white,drawbox=w=30:h=27:x=188:y=124:t=fill:c=white,drawbox=w=50:h=54:x=371:y=7:t=fill:c=white,drawbox=w=18:h=38:x=248:y=107:t=fill:c=white,drawbox=w=21:h=51:x=242:y=33:t=fill:c=white,mpdecimate=hi=64*80:lo=64*40:frac=0.001,scale=w=iw*4:h=ih*4[deduped];[deduped][full]overlay=shortest=1,setpts=N/(15*TB),mpdecimate=hi=64*80:lo=64*50:frac=0.001,setpts=N/(15*TB)' -r 15 -c:v libx265 -preset slower -crf 37 -pix_fmt yuv420p -an result.mkv
    ffmpeg 版本 4.1.6
    Debian 4.19.171-2
    我希望我的过滤器可以以某种方式进行调整,以达到相同的结果,但不会占用太多 RAM - 但我不知道如何。在合理的范围内,我不介意处理时间是否受到影响。任何提示表示赞赏。

    最佳答案

    似乎可以通过删除拆分过滤器来避免内存问题。与其将一个输入分成两个流(ffmpeg 必须存储在内存中),不如将相同的输入加载两次。
    所以不要使用“完整”和“虚拟”,如下所示

    ffmpeg -i source -vf 'split=2[full][dummy];...;[dummy][full]overlay...
    有人会使用“0:v”和“1:v”,如
    ffmpeg -i source -i scource -filter_complex '.....;[0:v][1:v]overlay...
    我让它与输入视频一起工作,但到目前为止 I fail to do this with the concat demuxer as input .
    任何提示都非常受欢迎。

    关于filter - 如何避免 ffmpeg 内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66724106/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com