Is it possible to speed up video with audio using ffmpeg, without changing audio pitch?
Solution 1:
It can be done with ffmpgeg using a complex filter:
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
Doku: https://trac.ffmpeg.org/wiki/How%20to%20speed%20up%20/%20slow%20down%20a%20video
The command above works if you want to multiply by 2 the speed. If you want to multiply by any , the parameters become:
ffmpeg -i input.mkv -filter_complex "[0:v]setpts=<1/x>*PTS[v];[0:a]atempo=<x>[a]" -map "[v]" -map "[a]" output.mkv
For instance, if you want to multiply by 1.15, the command is
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
Solution 2:
You can speed up video by 2.5X for example by doing this:
ffmpeg -i "input_video.mp4" -vf "setpts=(PTS-STARTPTS)/2.5" -af atempo=2.5 "input_video_2.5X.mp4"
Here is a bash script you can use for convenience (say convert_video.sh
):
#!/bin/bash
# Arguments
FILE_RAW=$1
SPEED_FACTOR=${2:-1.0} # Default is 1.0 X speed
# Prepare variables
BASE_PATH=$(dirname $(readlink -f $FILE_RAW))
FILENAME_EXT="$(basename "${FILE_RAW}")"
FILENAME_ONLY="${FILENAME_EXT%.*}"
EXT_ONLY="${FILENAME_EXT#*.}"
FILENAME_ONLY_PATH="${BASE_PATH}/${FILENAME_ONLY}"
# Speed up/slow down video
ffmpeg -i "${FILENAME_ONLY_PATH}.${EXT_ONLY}" -vf "setpts=(PTS-STARTPTS)/${SPEED_FACTOR}" -af atempo=$SPEED_FACTOR "${FILENAME_ONLY_PATH}_${SPEED_FACTOR}X.${EXT_ONLY}"
Note: Make script executable: chmod +x convert_video.sh
Usage (Output File: <PATH_TO_INPUT_VIDEO>_<OPTIONAL_SPEED>X.mp4
)
. <PATH_TO_THIS_SCRIPT>/convert_video.sh <PATH_TO_INPUT_VIDEO> <OPTIONAL_SPEED>
Example 1: Speed up video to 2.5X (Output: ~/Videos/input_video_2.5X.mp4
)
. ~/convert_video.sh ~/Videos/input_video.mp4 2.5
Example 2: Slow down video to 0.5X (Output: ~/Videos/input_video_0.5X.mp4
)
. ~/convert_video.sh ~/Videos/input_video.mp4 0.5
Hope it helps.