Faster Lossless to AAC Batch Encoding on a Mac (using command line with multiprocessing)

Warning: This script could screw things up. If you don’t feel comfortable with shell scripts, this might not be for you.

#!/bin/bash
set -e # exit script if control-c is used
USAGE="Usage: convert_to_aac.sh source_dir destination_dir num_processes"
# --- Options processing -------------------------------------------
if [ $# == 0 ] ; then
    echo $USAGE
    exit 1;
fi

PROCESSES=${3:-2}

# Convert relative path to absolute. Also remove trailing slash
export SOURCE_DIR="$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
SOURCE_DIR=$(dirname "$SOURCE_DIR/temp") # this fixes . and ./
export DESTINATION_DIR="$(cd "$(dirname "$2")"; pwd)/$(basename "$2")"
DESTINATION_DIR=$(dirname "$DESTINATION_DIR/temp") # this fixes . and ./

convertfile() {
  FILE=$1
  ORIG_DIR=$(dirname "$FILE")
  # Get basename and remove extension
  BASE=$(basename "$FILE") # get filename
  BASE=${BASE%.*} # remove extension from filename
  NEW_DIR=${ORIG_DIR/$SOURCE_DIR/$DESTINATION_DIR}
  mkdir -p "$NEW_DIR"
  NEW_FILE="$NEW_DIR/$BASE.m4a"
  if [ ! -f "$NEW_FILE" ]; then
    echo "Converting $FILE to $NEW_FILE"
    afconvert "$FILE" -o "$NEW_FILE" -q 127 -b 192000 -f m4af -d aac
  fi
}

export -f convertfile

find "$SOURCE_DIR" \( -iname '*.flac' -or -iname '*.m4a' \) -type f -print0|xargs -0 -P $PROCESSES -I % bash -c 'convertfile "%"'

Digital Audio Playlist:
https://www.youtube.com/playlist?list=PLErU2HjQZ_ZPoumpVxfXEm8-ZiEKlMjnM

Leave a comment

Your email address will not be published. Required fields are marked *