Skip to content

Instantly share code, notes, and snippets.

@gravataLonga
Created May 15, 2018 10:42
Show Gist options
  • Select an option

  • Save gravataLonga/aa17cc0f0ee9f169f8bcdb509dcc8bc7 to your computer and use it in GitHub Desktop.

Select an option

Save gravataLonga/aa17cc0f0ee9f169f8bcdb509dcc8bc7 to your computer and use it in GitHub Desktop.
Convert QL Video to MP4
#!/bin/bash
function file_extension {
local filename=$(basename "$1")
echo "${filename##*.}"
}
function basename_test {
echo $(basename "$1" .qt)
}
function decide_video_codec_from_extension {
if [ "$1" == "mp4" ]
then
echo "libx264"
elif [ "$1" == "webm" ]
then
echo "libvpx" # or libvpx-vp9
else
echo "" 1>&2
echo "Unknown video extension; supported are: mp4 webm" 1>&2
kill -INT $$
fi
}
for F in *.qt;
do
OUTPUT_FILE=$(basename_test $F)
OUTPUT_FILE="$OUTPUT_FILE.mp4"
# decide which codec to use based on extension
OUTPUT_EXTENSION=$(file_extension ${OUTPUT_FILE})
FFMPEG_ARG_VIDEO_CODEC=$(decide_video_codec_from_extension ${OUTPUT_EXTENSION})
echo "Format: ${OUTPUT_EXTENSION} (${FFMPEG_ARG_VIDEO_CODEC})"
# read video duration (in miliseconds) from file
SOURCE_LENGTH_MS=`mediainfo --Inform="General;%Duration%" "${F}"`
echo "Video length: $((${SOURCE_LENGTH_MS} / 1000)) seconds"
# read desired file size from stdin
echo ""
echo -n "Target size in MB: "
SIZE=$(stat -f%z "$F")
# TODO: Need better handler over size.
CAL=$(bc -l <<< "scale=0; $SIZE/1024/1024 +1")
TARGET_MB=$CAL
# calculate bitrates
TARGET_KBPS=$((1000 * ${TARGET_MB} * 1024 * 8 / ${SOURCE_LENGTH_MS} - 32))
AUDIO_KBPS=128
VIDEO_KBPS=$((${TARGET_KBPS} - ${AUDIO_KBPS}))
echo "Target video bitrate: ${VIDEO_KBPS} kbps"
echo "Target audio bitrate: ${AUDIO_KBPS} kbps"
# build command arguments
VIDEO_ARGS="-c:v ${FFMPEG_ARG_VIDEO_CODEC} -b:v ${VIDEO_KBPS}k -pix_fmt yuv420p"
# [ ! -z "${VIDEO_PRESET}" ] && VIDEO_ARGS="${VIDEO_ARGS} -preset ${VIDEO_PRESET}"
# [ ! -z "${VIDEO_SCALE}" ] && VIDEO_ARGS="${VIDEO_ARGS} -filter:v \"scale=${VIDEO_SCALE}\""
[ "${FFMPEG_ARG_VIDEO_CODEC}" == "libx264" ] && VIDEO_ARGS="${VIDEO_ARGS} -profile:v baseline -level 3.0 -movflags +faststart"
AUDIO_ARGS=""
[ "${OUTPUT_EXTENSION}" == "mp4" ] && AUDIO_ARGS="-c:a aac -b:a ${AUDIO_KBPS}k"
[ "${OUTPUT_EXTENSION}" == "webm" ] && AUDIO_ARGS="-c:a libvorbis -b:a ${AUDIO_KBPS}k"
# build and execute commands
CMD_PASS1="ffmpeg -y -i \"$F\" ${VIDEO_ARGS} -pass 1 ${AUDIO_ARGS} -f \"${OUTPUT_EXTENSION}\" /dev/null"
CMD_PASS2="ffmpeg -i \"$F\" ${VIDEO_ARGS} -pass 2 ${AUDIO_ARGS} \"${OUTPUT_FILE}\""
echo ""
echo "PASS 1 - EXECUTING COMMAND: $CMD_PASS1"
eval "$CMD_PASS1"
echo ""
echo ""
echo ""
echo "PASS 2 - EXECUTING COMMAND: $CMD_PASS2"
eval "$CMD_PASS2"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment