From f78ed50a7c5f1ccb025c8752c07b9fb52dc90b81 Mon Sep 17 00:00:00 2001 From: Arkadiusz Wieczorek Date: Wed, 13 Jul 2022 08:43:35 +0200 Subject: [PATCH] Add scripts --- change-length-audio.sh | 75 ++++++++++++++++++++++++++++++++++ change-length-video-HWACCEL.sh | 75 ++++++++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100755 change-length-audio.sh create mode 100755 change-length-video-HWACCEL.sh diff --git a/change-length-audio.sh b/change-length-audio.sh new file mode 100755 index 0000000..14fd956 --- /dev/null +++ b/change-length-audio.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +# usage: change-length.sh 1.007 input.mp4 output.mp4 [--fast] +# ^output.mp4 will be be 7% longer +# --fast is faster, but slightly more risky + +set -euo pipefail + +RATIO=$1; +IN_FILE=$2; +OUT_FILE=$3; +MODE=${4-"--slow"}; +# BITRATE=$(ffmpeg -i "$IN_FILE" 2>&1 | grep bitrate | awk -F", " '{print $3}' | sed 's/bitrate: //' | sed 's/ //' | sed 's/b\/s//' || echo ""); + +echo ratio set to "$RATIO" + +INV_RATIO=$(python -c "print(1/$RATIO)"); + +FILTER=""; +OPTS=(); + +AUDIO_FILTER="[0:a]atempo=$(echo "$INV_RATIO")[a]"; + +HAS_AUDIO=$(ffprobe "$IN_FILE" 2>&1 | grep Stream | grep --count Audio || echo "0"); +HAS_VIDEO=$(ffprobe "$IN_FILE" 2>&1 | grep Stream | grep --count Video || echo "0"); + +slow () { + echo " "; + echo " "; + echo " "; + echo " "; + echo "USING SLOW MODE. If you want only video, use --fast"; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "Checking streams within the file..."; + + if [ "$HAS_AUDIO" -ge 0 ]; then + FILTER=$AUDIO_FILTER; + OPTS+=(-map "[a]"); + fi; + + if [ "$HAS_VIDEO" -ge 0 ]; then + FILTER="$FILTER;[0:v]setpts=$RATIO*PTS[v]"; + OPTS+=(-map "[v]"); + fi; + + echo "running with filter $FILTER"; + + # ffmpeg -i "$IN_FILE" -b:v $BITRATE -filter_complex "$FILTER" "${OPTS[@]}" "$OUT_FILE"; + ffmpeg -i "$IN_FILE" -filter_complex "$FILTER" "${OPTS[@]}" "$OUT_FILE"; +} + +fast (){ + if [ "$HAS_AUDIO" -ge 0 ]; then + TEMP_VIDEO="$(dirname $IN_FILE)/.temp.$(random).video.$(basename "$IN_FILE")"; + ffmpeg -itsscale "$RATIO" -i "$IN_FILE" -c copy -an "$TEMP_VIDEO"; + TEMP_AUDIO="$(dirname $IN_FILE)/.temp.$(random).audio.$(basename "$IN_FILE")"; + ffmpeg -i "$IN_FILE" -filter_complex "$AUDIO_FILTER" -vn -map "[a]" "$TEMP_AUDIO"; + ffmpeg -i "$TEMP_VIDEO" -i "$TEMP_AUDIO" -c:v copy -c:a copy "$OUT_FILE"; + rm -f "$TEMP_AUDIO" "$TEMP_VIDEO"; + else + ffmpeg -itsscale "$RATIO" -i "$IN_FILE" -c copy -an "$OUT_FILE"; + fi; +} + +if [ "$MODE" = "--fast" ]; then + fast; +else + slow +fi; diff --git a/change-length-video-HWACCEL.sh b/change-length-video-HWACCEL.sh new file mode 100755 index 0000000..66a9e0c --- /dev/null +++ b/change-length-video-HWACCEL.sh @@ -0,0 +1,75 @@ +#!/bin/bash -x + +# usage: change-length.sh 1.007 input.mp4 output.mp4 [--fast] +# ^output.mp4 will be be 7% longer +# --fast is faster, but slightly more risky + +set -euo pipefail + +RATIO=$1; +IN_FILE=$2; +OUT_FILE=$3; +MODE=${4-"--slow"}; +BITRATE=$(ffmpeg -i "$IN_FILE" 2>&1 | grep bitrate | awk -F", " '{print $3}' | sed 's/bitrate: //' | sed 's/ //' | sed 's/b\/s//' || echo ""); + +echo ratio set to "$RATIO" + +INV_RATIO=$(python -c "print(1/$RATIO)"); + +FILTER=""; +OPTS=(); + +AUDIO_FILTER="[0:a]atempo=$(echo "$INV_RATIO")[a]"; + +HAS_AUDIO=$(ffprobe "$IN_FILE" 2>&1 | grep Stream | grep --count Audio || echo "0"); +HAS_VIDEO=$(ffprobe "$IN_FILE" 2>&1 | grep Stream | grep --count Video || echo "0"); + +slow () { + echo " "; + echo " "; + echo " "; + echo " "; + echo "USING SLOW MODE. If you want only video, use --fast"; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo " "; + echo "Checking streams within the file..."; + + if [ "$HAS_AUDIO" -ge 0 ]; then + FILTER=$AUDIO_FILTER; + OPTS+=(-map "[a]"); + fi; + + if [ "$HAS_VIDEO" -ge 0 ]; then + FILTER="$FILTER;[0:v]setpts=$RATIO*PTS,hwupload[v]"; + OPTS+=(-map "[v]"); + fi; + + echo "running with filter $FILTER"; + + ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -i "$IN_FILE" -b:v $BITRATE -filter_complex "$FILTER" "${OPTS[@]}" -c:v h264_vaapi "$OUT_FILE"; +# ffmpeg -i "$IN_FILE" -filter_complex "$FILTER" "${OPTS[@]}" "$OUT_FILE"; +} + +fast (){ + if [ "$HAS_AUDIO" -ge 0 ]; then + TEMP_VIDEO="$(dirname $IN_FILE)/.temp.$(random).video.$(basename "$IN_FILE")"; + ffmpeg -itsscale "$RATIO" -i "$IN_FILE" -c copy -an "$TEMP_VIDEO"; + TEMP_AUDIO="$(dirname $IN_FILE)/.temp.$(random).audio.$(basename "$IN_FILE")"; + ffmpeg -i "$IN_FILE" -filter_complex "$AUDIO_FILTER" -vn -map "[a]" "$TEMP_AUDIO"; + ffmpeg -i "$TEMP_VIDEO" -i "$TEMP_AUDIO" -c:v copy -c:a copy "$OUT_FILE"; + rm -f "$TEMP_AUDIO" "$TEMP_VIDEO"; + else + ffmpeg -itsscale "$RATIO" -i "$IN_FILE" -c copy -an "$OUT_FILE"; + fi; +} + +if [ "$MODE" = "--fast" ]; then + fast; +else + slow +fi;