Atualização de “converter vídeos”…

Neste post aqui, escrito em 2012, usava uma versão mais antiga do ffmpeg e, de lá para cá, meu script deu uma melhorada… Eis o mais recente:

#!/bin/bash

# Agora o script aceita diversos vídeos...
if [ -z "$1" ]; then 
  echo -e "\e[1;33mUsage\e[0m: vid2mp4 <video1> [... <videoN>]";
  exit 1; 
fi

interruption() {
  [[ -e "${TMPFNAME}" ]] && rm "${TMPFNAME}"
}

# Apaga o arquivo temporário em caso de interrupção...
trap interruption INT

# Retira metadados do vídeo destino.
EXTRA_PARAMS="-map_metadata -1"

# Para todos os vídeos informados na linha de comando (aceita 'globs').
for i in "$@"; do
  # Se o arquivo não existe, mostra e tenta o próximo...
  if [ ! -f "$i" ]; then
    echo -e "\e[1;31mERROR\e[0m: Cannot find '$i'."
    continue
  fi

  # Pega o nome do codec de vídeo.
  # OBS: mediainfo poderia ser mais fácil...
  VCODEC="$(ffprobe -v quiet -select_streams v:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$i")"

  # Ajusta parâmetros de compressão para h264
  # Uso Constant Rate Frame porque me dá boa qualidade...
  VPARAMS="-c:v libx264 -crf 18"
  if [ "$VCODEC" == "h264" ]; then
    VPARAMS="-c:v copy"
  fi

  # Gosto de AC3, stereo e 160 kbps de bitrate para audio.
  APARAMS="-c:a ac3 -b:a 160k -ac 2"

  TMPFNAME="$(mktemp /tmp/tmp_XXXXXXXXXX.mp4)"
  OFNAME="${i%.*}.mp4"

  # Mostra algumas infos sobre o arquivo (usa mediainfo).
  DURATION="$(mediainfo --Inform="Video;%Duration/String3%" "$i")"
  LENGTH="$(du -h "$i" | cur -f1)"
  echo -e "\e[1;33mConverting \e[1;37m'$i'\e[0m (Duration: ${DURATION}; Size: ${LENGTH})..."

  # Finalmente, converte.
  ffmpeg -hide_banner -v quiet -stats -y -i "$i" $VPARAMS $APARAMS $EXTRA_PARAMS $TMPFNAME && \
    rm "$i" && \
    mv "$TMPFNAME" "$OFNAME"
done