是否可以在不改变音频音调的情况下使用 ffmpeg 加速带音频的视频?

bdu*_*a74 17 audio video ffmpeg

有没有一种相对简单的方法来加速视频(mp4,带有 aac 编码的音频),比如“x1.25”或“x1.3”,同时保持原始音视频同步,但也保留原始音高声音的 ?

我已经阅读了一些关于将音轨提取到单独的文件中的讨论,然后用于rubberband将音调降低所需的值,然后使用 ffmpeg 加速合并音频视频轨道,这将音频的音调再次提高回原始. 然而,这似乎有点命中注定,因为rubberband似乎使用八度音程数作为参数来提高或降低音高,并且这可能并不总是与视频完美匹配,因为音符/八度音程具有特定的比率。而且,这很麻烦。

那么,有没有单独使用 ffmpeg 的更简单的方法?

Wei*_*nde 26

它可以通过使用复杂过滤器的 ffmpgeg 来完成:

  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
Run Code Online (Sandbox Code Playgroud)

Doku:https ://trac.ffmpeg.org/wiki/How%20to%20speed%20up%20/%20slow%20down%20a%20video

如果您想将速度乘以 2,则上述命令有效。如果你想乘以 any ,参数变为:

  ffmpeg -i input.mkv -filter_complex "[0:v]setpts=<1/x>*PTS[v];[0:a]atempo=<x>[a]" -map "[v]" -map "[a]" output.mkv
Run Code Online (Sandbox Code Playgroud)

例如,如果你想乘以 1.15,命令是

  ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.87*PTS[v];[0:a]atempo=1.15[a]" -map "[v]" -map "[a]" output.mkv
Run Code Online (Sandbox Code Playgroud)

  • 对于半速:atempo=0.5 且 setpts=2 (2认同)

sag*_*nms 9

例如,您可以通过执行以下操作将视频速度加快 2.5 倍:

ffmpeg -i "input_video.mp4" -vf "setpts=(PTS-STARTPTS)/2.5" -af atempo=2.5 "input_video_2.5X.mp4"
Run Code Online (Sandbox Code Playgroud)

为了方便起见,您可以使用以下 bash 脚本(例如convert_video.sh):

ffmpeg -i "input_video.mp4" -vf "setpts=(PTS-STARTPTS)/2.5" -af atempo=2.5 "input_video_2.5X.mp4"
Run Code Online (Sandbox Code Playgroud)

注意:使脚本可执行:chmod +x convert_video.sh

用法(输出文件<PATH_TO_INPUT_VIDEO>_<OPTIONAL_SPEED>X.mp4:)

. <PATH_TO_THIS_SCRIPT>/convert_video.sh <PATH_TO_INPUT_VIDEO> <OPTIONAL_SPEED>
Run Code Online (Sandbox Code Playgroud)

示例 1:将视频速度加快至 2.5 倍(输出:~/Videos/input_video_2.5X.mp4

. ~/convert_video.sh ~/Videos/input_video.mp4 2.5
Run Code Online (Sandbox Code Playgroud)

示例 2:将视频速度减慢至 0.5 倍(输出:~/Videos/input_video_0.5X.mp4

. ~/convert_video.sh ~/Videos/input_video.mp4 0.5
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。