Busca recursivamente arquivos .mp4 e processa-os com ffmpeg [closed]

1

Eu tenho um monte de arquivos de vídeo .mp4 que estão localizados em pastas diferentes. Eu gostaria de processar todos esses arquivos de vídeo com ffmpeg usando o seguinte comando no Ubuntu (o vídeo processado é armazenado com um novo nome de arquivo):

ffmpeg -i input_video -vf scale=w=320:h=-1 -y -vcodec libx264 -preset ultrafast -r 20 output_video

Eu gostaria de fazer isso com um script que busca recursivamente todos os arquivos de vídeo .mp4 que contenham a string "xyz" no nome do arquivo e como pasta raiz eu gostaria de usar /media/myShare .

Além disso, de tempos em tempos, adiciono novos arquivos de vídeo a subdiretórios. Quando eu executo novamente o script, não quero processar os já convertidos e processar apenas os recém-adicionados. Como tudo isso pode ser feito?

Qualquer ajuda seria muito apreciada.

    
por machinery 24.03.2018 / 20:30

1 resposta

2

Existem algumas propriedades que o seu futuro script deve ter, vamos percorrê-las uma a uma:

Encontre recursivamente todos os arquivos MP4 com um padrão no nome do arquivo e processe-os

Aqui seu amigo é find - você não precisa da maioria das opções, então algo como find "$STARTFOLDER" -type f -name '*$PATTERN*.mp4' é um bom começo. Você pode iterar sobre isso com um for construct

O que você não mencionou: criar automaticamente um novo nome de arquivo

Você pode querer usar basename para isso, algo nos moldes de BN=$(basename "$FILEPATH" '.mp4'); BP=$(dirname "$FILEPATH"); NEWFILENAME="$BP/$BN-converted.mp4" parece ser bom.

Juntando tudo

Agora que temos todos os blocos de construção, só precisamos conectar as coisas:

#!/bin/bash

STARTFOLDER="/media/myShare"
PATTERN="xyz"
MARKER="converted"

echo -n "Finding candidate files .."
FILELIST=$(find "$STARTFOLDER" -type f -name '*$PATTERN*.mp4')
echo ".. "$(echo -e "$FILELIST" | wc -l)" found"

while read FILEPATH; do
  # A bit of healthy paranoia
  test -z "$FILEPATH" && continue
  test -f "$FILEPATH" || continue
  echo -n "Working on $FILEPATH .."

  # New file name
  BN=$(basename "$FILEPATH" '.mp4')
  BP=$(dirname "$FILEPATH")
  NEWFILEPATH="$BP/$BN-$MARKER.mp4"

  # Skip result files
  ISRESULT=$(echo "$BN" | grep -e "$MARKER\.mp4\$")
  if test -n "$ISRESULT"; then
    echo "..  skipping (is a result file)"
    continue
  fi

  # Skip processed files
  if test -f "$NEWFILEPATH"; then
    echo "..  skipping (result file exists)"
    continue
  fi

  # Process
  echo -n ".. running ffmpeg .."
  RES=$(ffmpeg -i "$FILEPATH" -vf scale=w=320:h=-1 -y -vcodec libx264 -preset ultrafast -r 20 "$NEWFILEPATH" </dev/null 2>&1)
  echo ".. done (exit code $?)"

done < <(echo -e "$FILELIST")

Ressalva: Isso não foi testado, é provável que os erros de digitação

    
por 24.03.2018 / 21:04