使用ffmpeg裁剪HEVC视频:时长正确但输出文件体积过大求助
问题:FFmpeg裁剪HEVC视频时长正确但体积过大
在MacOS终端使用FFmpeg 5.1.2裁剪8mm数字化、16fps的HEVC格式MP4视频时,输出视频时长符合设置,但文件体积远超出预期。
执行命令:
ffmpeg -ss 05:09 -i input.mp4 -t 02:19 -an -sn -dn -c copy output.mp4
文件参数:
input.mp4:时长11分56秒,文件大小8.24GB(码率674251 kbits/s)output.mp4:时长2分19秒,文件大小5.15GB(体积异常)
按原码率计算,5.15GB对应的是起始位置+时长(05:09+02:19)的文件体积,计算值为5.16GB,与实际输出体积几乎一致。更换不同的-ss和-t参数测试,结果相同:时长符合要求,但体积等于(起始点+时长)×原码率。
补充:输入文件仅在t=0.000s处有一个关键帧,这可能是问题根源。
FFmpeg标准输出
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x14ff04760] Using non-standard frame rate 16384/1024 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 creation_time : 2021-07-24T11:23:44.000000Z encoder : Lavf58.45.100 Duration: 00:11:56.13, start: 0.000000, bitrate: 92041 kb/s Stream #0:0[0x1](und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709/bt709/unknown, progressive), 5120x3840 [SAR 1:1 DAR 4:3], 91715 kb/s, 16 fps, 16 tbr, 16384 tbn (default) Metadata: creation_time : 2021-07-24T11:23:44.000000Z handler_name : VideoHandler vendor_id : [0][0][0][0] timecode : 17:15:11:05 Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 159 kb/s (default) Metadata: creation_time : 2021-07-24T11:23:44.000000Z handler_name : SoundHandler vendor_id : [0][0][0][0] Stream #0:2[0x3](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 159 kb/s (default) Metadata: creation_time : 2021-07-24T11:23:44.000000Z handler_name : SoundHandler vendor_id : [0][0][0][0] Stream #0:3[0x4](eng): Data: none (tmcd / 0x64636D74) Metadata: creation_time : 2021-07-24T11:23:44.000000Z handler_name : TimeCodeHandler timecode : 17:15:11:05 File 'output.mp4' already exists. Overwrite? [y/N] y [mp4 @ 0x14ff08660] Using non-standard frame rate 16/1 Last message repeated 1 times Output #0, mp4, to 'output.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 encoder : Lavf59.27.100 Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709/bt709/unknown, progressive), 5120x3840 [SAR 1:1 DAR 4:3], q=2-31, 91715 kb/s, 16 fps, 16 tbr, 16384 tbn (default) Metadata: creation_time : 2021-07-24T11:23:44.000000Z handler_name : VideoHandler vendor_id : [0][0][0][0] timecode : 17:15:11:05 Stream mapping: Stream #0:0 -> #0:0 (copy) Press [q] to stop, [?] for help frame= 4290 fps=0.0 q=-1.0 Lsize= 2988507kB time=00:02:18.93 bitrate=176207.6kbits/s speed= 189x video:2988420kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.002924%
ffprobe output.mp4结果
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x130804080] Using non-standard frame rate 16384/1024 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 encoder : Lavf59.27.100 Duration: 00:02:19.31, start: 0.000000, bitrate: 175732 kb/s Stream #0:0[0x1](und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709/bt709/unknown, progressive), 5120x3840 [SAR 1:1 DAR 4:3], 91304 kb/s, 16 fps, 16 tbr, 16384 tbn (default) Metadata: handler_name : VideoHandler vendor_id : [0][0][0][0] timecode : 17:15:11:05 Stream #0:1[0x2](eng): Data: none (tmcd / 0x64636D74) Metadata: handler_name : VideoHandler timecode : 17:15:11:05 Unsupported codec with id 0 for input stream 1
解决方案
你的判断完全正确,输入视频仅在开头有一个关键帧是导致体积异常的核心原因。
原因解析
使用-c copy时,FFmpeg直接复制原始视频流数据,不做重新编码。HEVC这类帧间编码格式中,非关键帧(P/B帧)依赖前面的关键帧才能解码。由于截取起始点(05:09)没有关键帧,FFmpeg必须从开头的唯一关键帧开始复制数据,才能保证片段可正常播放。这就导致实际复制的是从开头到结束点(05:09+02:19)的所有数据,播放器仅播放指定时长,但文件包含了前面的冗余内容,因此体积异常。
两种解决方法
重新编码(推荐,体积匹配时长)
放弃-c copy,让FFmpeg重新编码视频,精准截取片段并生成正确的关键帧结构:ffmpeg -ss 05:09 -i input.mp4 -t 02:19 -an -sn -dn -c:v libx265 -crf 28 output.mp4-crf 28:控制视频质量,数值越大质量越低、体积越小,HEVC合理范围为20-30,可按需调整。- 重新编码耗时更长,但输出文件体积会与片段时长匹配。
先插入关键帧(快速处理)
若不想重新编码,先给输入视频在截取起始位置插入关键帧,再进行复制裁剪:# 先在05:09位置插入关键帧,生成临时文件 ffmpeg -i input.mp4 -force_key_frames 00:05:09 temp.mp4 # 裁剪临时文件 ffmpeg -ss 05:09 -i temp.mp4 -t 02:19 -an -sn -dn -c copy output.mp4该方法比重新编码快,但临时文件和最终输出体积会略大于重新编码的结果。
内容的提问来源于stack exchange,提问作者ddessert
相关产品推荐
相关产品推荐

