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 error和no frame!也可能是输入视频7.mp4在191秒之后的部分有损坏的帧,你可以先测试导出这段内容的一小部分:
ffmpeg -i 7.mp4 -ss 191 -t 10 test.mp4
如果test.mp4无法正常播放,说明原视频有损坏,需要先修复原视频再处理。
备注:内容来源于stack exchange,提问作者Ricardo Bohner




