1

У меня есть куча видеофайлов .mp4, которые расположены в разных папках. Я хотел бы обработать все эти видеофайлы с помощью ffmpeg, используя следующую команду в Ubuntu (обработанное видео сохраняется с новым именем файла):

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

Я хотел бы сделать это с помощью bash-скрипта, который рекурсивно ищет все видеофайлы .mp4, которые содержат строку "xyz" в имени файла и в качестве корневой папки я хотел бы использовать /media/myShare .

Кроме того, время от времени я добавляю новые видео файлы в подкаталоги. Когда я перезапускаю скрипт, я не хочу обрабатывать уже преобразованные и только новые. Как все это можно сделать?

Любая помощь будет принята с благодарностью.

1 ответ1

2

У вашего сценария должно быть несколько свойств, давайте просто пройдемся по ним один за другим:

Рекурсивно найти все файлы MP4 с шаблоном в имени файла и обработать их

Здесь ваш друг находится в find - вам не нужно большинство опций, поэтому что-то вроде find "$STARTFOLDER" -type f -name '*$PATTERN*.mp4' - хорошее начало. Вы можете перебрать их с помощью for конструкции

То, что вы не упомянули: автоматическое создание нового имени файла

Возможно, вы захотите использовать для этого basename что-то вроде BN=$(basename "$FILEPATH" '.mp4'); BP=$(dirname "$FILEPATH"); NEWFILENAME="$BP/$BN-converted.mp4" выглядит хорошо.

Собираем все вместе

Теперь, когда у нас есть все строительные кирпичи, нам просто нужно соединить вещи:

#!/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")

Предостережение: это полностью не проверено, опечатки, скорее всего,

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .