【问题标题】:Audio and Video not synced after cut multiple parts - FFMPEG剪切多个部分后音频和视频不同步 - FFMPEG
【发布时间】:2022-02-26 22:19:21
【问题描述】:

在尝试剪切视频的多个部分时,我遵循这个问题的解决方案 Cut multiple parts of a video with ffmpeg。但问题是,如果我剪切多次(比如大约 20 次或更多),视频和音频将无法同步。

这是我使用的基线:

  ffmpeg -i video \
       -vf "select='between(t,4,6.5)+between(t,17,26)+between(t,74,91)',
            setpts=N/FRAME_RATE/TB" \
       -af "aselect='between(t,4,6.5)+between(t,17,26)+between(t,74,91)',
            asetpts=N/SR/TB" out.mp4

【问题讨论】:

  • 你的视频帧率是多少?
  • 帧率 23.98 fps 音频:比特率 127kbps 音频采样率 44.100 kHz

标签: ffmpeg


【解决方案1】:

首先,解释。罪魁祸首是帧率:23.98 = 24000/1001 fps。对于between(t,4,6.5) 的示例,这些时间戳(以秒为单位)转换为第 95.904 帧和第 155.844 帧,这两个帧都不存在。假设select 选择最近的帧(它可能会截断,但你明白了):它实际上将剪切边界设置在第 96 帧 = 4.004 秒和第 156 帧 = 6.5065 秒。同时,aselect 可以在任意整数或半秒内选取准确的音频样本。因此,在此示例中,所选音频样本占您指定的确切 2.5 秒,而视频帧跨越 2.5025 秒,因此后者长 2.5 毫秒。虽然这种同步丢失量可能并不明显,但当您进行 20 次剪辑时,此错误会更加严重。

那么,如何解决这个问题?我能想到的方法有两种:

  1. 将所有视频select 时间调整为(接近)精确的帧时间。像上面的例子一样,计算所有剪辑的最近帧时间,并在selectaselect 上使用它们。以防万一,公式为t = round(t_desired*24000/1001)*1001/24000。音频样本可能与调整后的时间不一致,但每次剪辑只引入少于1/44100 = 22.68 us 的错误。这不应该是明显的,即使加上 20 次削减

  2. 通过在 select 过滤器前面添加 fps=24 过滤器来更改视频帧速率。此帧速率保证帧与整数/半/四分之一秒对齐。如果需要 23.98 fps,您还可以添加 -r 24000/1001 输出选项以恢复到原始速率。

希望其中之一能帮助您解决问题。

【讨论】:

    猜你喜欢
    • 2019-09-29
    • 2012-03-16
    • 2016-05-26
    • 2018-11-08
    • 1970-01-01
    • 2017-04-26
    • 2017-05-05
    • 1970-01-01
    • 2016-05-25
    相关资源
    最近更新 更多