You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)的所有数据,播放器仅播放指定时长,但文件包含了前面的冗余内容,因此体积异常。

两种解决方法

  1. 重新编码(推荐,体积匹配时长)
    放弃-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,可按需调整。
    • 重新编码耗时更长,但输出文件体积会与片段时长匹配。
  2. 先插入关键帧(快速处理)
    若不想重新编码,先给输入视频在截取起始位置插入关键帧,再进行复制裁剪:

    # 先在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:50:54