You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

FFmpeg拼接不同速度视频片段时出现内存分配失败等错误的求助

FFmpeg拼接不同速度视频片段时出现内存分配失败等错误的求助

看起来你在尝试拼接原视频的两段内容(前9秒正常速度,191秒到1174秒部分20倍速)时遇到了解码错误和内存分配问题,虽然你有16G内存,但FFmpeg处理复杂滤镜链时的资源占用逻辑可能导致了这个问题,我来帮你捋捋可能的原因和解决办法:

你的当前命令

ffmpeg -i 7.mp4 -filter_complex "[0:v]select='between(t,0,9)',setpts=PTS-STARTPTS[vn];[0:a]aselect='between(t,0,9)',asetpts=PTS-STARTPTS[an];[0:v]select='between(t,191,1174)',setpts=(1/20)*(PTS-STARTPTS)[vr];[0:a]aselect='between(t,191,1174)',atempo=20,asetpts=PTS-STARTPTS[ar];[vn][an][vr][ar]concat=n=2:v=1:a=1[vid]" -map [vid] -c:v libx265 -tag:v hvc1 -crf 23 -preset slow "output5.mp4"

你遇到的错误信息

[h264 @ 00000181d923ccc0] get_buffer() failed
[h264 @ 00000181d923ccc0] thread_get_buffer() failed
[h264 @ 00000181d923ccc0] decode_slice_header error
[h264 @ 00000181d923ccc0] no frame!
[fc#0 @ 00000181d91dbdc0] Task finished with error code: -12 (Cannot allocate memory)peed=0.0342x
[fc#0 @ 00000181d91dbdc0] Terminating thread with return code -12 (Cannot allocate memory)
[vist#0:0/h264 @ 00000181db1bbcc0] [dec:h264 @ 00000181d91e4680] Error submitting packet to decoder: Invalid data found when processing input

问题分析与解决建议

1. 优先尝试:限制解码器线程数+统一像素格式

虽然你有16G内存,但FFmpeg默认会根据CPU核心数启用大量解码线程,同时处理两路输入流时容易导致内存碎片化或资源过载。你可以在命令开头添加线程限制参数,同时给每个视频滤镜分支统一像素格式,减少额外的内存开销:

ffmpeg -threads 4 -i 7.mp4 -filter_complex "[0:v]select='between(t,0,9)',setpts=PTS-STARTPTS,format=yuv420p[vn];[0:a]aselect='between(t,0,9)',asetpts=PTS-STARTPTS[an];[0:v]select='between(t,191,1174)',setpts=(1/20)*(PTS-STARTPTS),format=yuv420p[vr];[0:a]aselect='between(t,191,1174)',atempo=20,asetpts=PTS-STARTPTS[ar];[vn][an][vr][ar]concat=n=2:v=1:a=1[vid]" -map [vid] -c:v libx265 -tag:v hvc1 -crf 23 -preset slow "output5.mp4"

-threads 4可根据你的CPU核心数调整,比如8核用4-6,4核用2-3

2. 更稳妥的方案:拆分处理步骤

复杂的单命令滤镜链容易出现资源冲突,建议分成三步处理,每个步骤只处理单一任务,内存压力会小很多:

  • 步骤1:导出正常速度片段
    ffmpeg -i 7.mp4 -ss 0 -to 9 -c:v libx265 -tag:v hvc1 -crf 23 -preset slow part1.mp4
    
  • 步骤2:导出20倍速片段
    ffmpeg -i 7.mp4 -ss 191 -to 1174 -filter:v "setpts=(1/20)*PTS" -filter:a "atempo=20" -c:v libx265 -tag:v hvc1 -crf 23 -preset slow part2.mp4
    
  • 步骤3:拼接两个片段
    先创建一个concat.txt文件,内容如下:
    file 'part1.mp4'
    file 'part2.mp4'
    
    然后运行拼接命令:
    ffmpeg -f concat -safe 0 -i concat.txt -c copy output5.mp4
    

3. 排除输入文件损坏的可能

错误里的decode_slice_header errorno frame!也可能是输入视频7.mp4在191秒之后的部分有损坏的帧,你可以先测试导出这段内容的一小部分:

ffmpeg -i 7.mp4 -ss 191 -t 10 test.mp4

如果test.mp4无法正常播放,说明原视频有损坏,需要先修复原视频再处理。

备注:内容来源于stack exchange,提问作者Ricardo Bohner

火山引擎 最新活动