为什么 ffmpeg 不缩短这个视频?

Joe*_*Joe 15 video ffmpeg

我正在尝试将视频的速度加倍。

我使用命令:

ffmpeg -i output.mp4 -filter:v "setpts=0.5*PTS" output2.mp4
Run Code Online (Sandbox Code Playgroud)

ffmpeg -i output.mp4 -vf "setpts=0.5*PTS" output3.mp4
Run Code Online (Sandbox Code Playgroud)

我在互联网上发现这是标准方法。

但是,我的所有文件的长度都相同:

joe@joe-Amd-Am4-Home-Office:~$ for file in *.mp4; do duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file"); echo "$file: $duration seconds"; done
output2.mp4: 373.014000 seconds
output3.mp4: 373.014000 seconds
output.mp4: 373.014000 seconds
Run Code Online (Sandbox Code Playgroud)

发生了什么事以及如何正确加快视频速度?我用的是ubuntu。

小智 26

我的第一个猜测是,此处记录的 PTS 方法“通过更改每个视频帧的呈现时间戳 (PTS)”来工作,玩家会尊重并加快速度。但这也许不会改变所报告的视频长度ffprobe

但摆弄我随机测试的 mp4 表明,虽然视频加速了,但音频却没有。这可以解释为什么我也通过 看到每个视频都有相同的时间戳ffprobe。这与上面链接的文档中的注释一致:

请注意,在以下示例中,音频流未更改,因此最好使用 禁用它-an

关于超级用户的另一个答案提供了以下复杂的过滤器来加速视频和音频:

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv

那个对我有用,通过显示一半的长度ffprobe

  • 完美--an 修复了它。也得到了很好的解释和测试。 (4认同)
  • 请注意,“setpts”可以被描述为非破坏性的,而“atempo”肯定会对音频进行转码(拉伸/音调转换)。它们是非常不同的运算,这也解释了为什么它们采用“逆”数。在这种情况下它们恰好同时使用......所以我想说过滤器图表不需要重写;) (2认同)