Skip to content

Instantly share code, notes, and snippets.

@kaisermann
Last active August 14, 2017 14:17
Show Gist options
  • Save kaisermann/db7a60fb98e97455432c0b8099bf26d2 to your computer and use it in GitHub Desktop.
Save kaisermann/db7a60fb98e97455432c0b8099bf26d2 to your computer and use it in GitHub Desktop.
[cli] video optimization
#!/usr/bin/env bash
# Needs ffmpeg and handbrakeCLI
DOTFILES_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
IN_DIR=${1:-"$DOTFILES_DIR/in"}
OUT_DIR=${2:-"$DOTFILES_DIR/out"}
CUR_TIMESTAMP=`date +'%d/%m/%Y %H:%M:%S'`
echo "### INIT: $CUR_TIMESTAMP" >> log.txt
find "$IN_DIR" -type f \( -iname \*.mp4 -o -iname \*.mov -o -iname \*.avi \) -print0 | while IFS= read -r -d '' ORIGIN_PATH;
do
FILENAME=`basename "$ORIGIN_PATH"`
FILENAME=${FILENAME%.*}
ORIGIN_RELATIVE_PATH="${ORIGIN_PATH#$IN_DIR}";
ORIGIN_RELATIVE_DIR=`dirname "$ORIGIN_RELATIVE_PATH"`;
ORIGIN_FILESIZE=`du -k "$ORIGIN_PATH" | cut -f 1`
TARGET_PATH="$OUT_DIR/$ORIGIN_RELATIVE_DIR/$FILENAME.mp4";
TARGET_DIR=`dirname "$TARGET_PATH"`;
OPTIMIZED_NAME="$FILENAME.optimized.mp4"
OPTIMIZED_PATH="$TARGET_DIR/$OPTIMIZED_NAME"
NO_ROTATION_DATA_NAME="$FILENAME.norotation.mp4"
NO_ROTATION_DATA_PATH="$TARGET_DIR/$NO_ROTATION_DATA_NAME"
mkdir -p "$TARGET_DIR";
echo '--- Removing rotation metadata';
yes | ffmpeg -i "$ORIGIN_PATH" -metadata:s:v:0 rotate=0 "$NO_ROTATION_DATA_PATH"
echo '--- Optimizing';
ROTATION=$(exiftool -Rotation "$NO_ROTATION_DATA_PATH" | cut -d ":" -f2 | sed 's/^[ ]*//')
yes | HandBrakeCLI -i "$NO_ROTATION_DATA_PATH" -o "$OPTIMIZED_PATH" --loose-anamorphic --quality 20 --rotate="angle=$ROTATION" --no-loose-crop --modulus 2 -f mp4 -e x264 -X 1920 -Y 1080 -2 -T -O;
rm -rf "$NO_ROTATION_DATA_PATH";
echo '--- Copying original metadata';
yes | ffmpeg -i "$ORIGIN_PATH" -i "$OPTIMIZED_PATH" -map 1 -map_metadata 0 -c copy "$TARGET_PATH";
rm -rf "$OPTIMIZED_PATH";
echo '--- Copying original timestamps';
touch -r "$ORIGIN_PATH" "$TARGET_PATH"
TARGET_FILESIZE=`du -k "$TARGET_PATH" | cut -f 1`
echo "$ORIGIN_PATH > $TARGET_PATH|deg:$ROTATION|$ORIGIN_FILESIZE > $TARGET_FILESIZE" >> log.txt
done
echo "### END: $CUR_TIMESTAMP" >> log.txt
#!/usr/bin/env bash
for i in *.mp4
do
r=$(exiftool -Rotation $i | cut -d ":" -f2 | sed 's/^[ ]*//')
HandBrakeCLI -i $i -o ./out/$i --rotate=angle=$r -e x264 -q 21 -X 1000
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment