Created
May 15, 2018 10:42
-
-
Save gravataLonga/aa17cc0f0ee9f169f8bcdb509dcc8bc7 to your computer and use it in GitHub Desktop.
Convert QL Video to MP4
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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