ffmpeg l oop через дерево каталогов, вывод в идентичное дерево в другом root, обрабатывать файлы только один раз - PullRequest
0 голосов
/ 21 июня 2020

Я бы хотел, чтобы ffmpeg постоянно l oop через одну структуру каталогов искал файлы * .webm, а затем преобразовывал их в mp4, когда они были найдены, выводя их в идентичную структуру подкаталогов по другому пути. Подкаталоги / файлы добавляются в дерево автоматически. Я могу сделать это вручную, но мои попытки сценария не удались, я использовал сценарий события ionotify для поиска новых каталогов и повторного запуска сценария преобразования, но он не будет работать постоянно. Я также не хочу обрабатывать файл снова после его преобразования.

Я использовал этот вызов с каждым inotify:

find /opt/media/ -name "t_str_*.webm" -exec bash -c \
'ffmpeg -loglevel panic -acodec libopus -i $0 -strict experimental -movflags faststart ${0/webm/mp4}' {} \;

У меня следующая структура каталогов, подкаталоги alphanumeri c.

Источник:

parent1
 - AAAAAA
   - file1.webm
 - BBBBBB
   - file2.webm
 - CCCCCC
   - file3.webm
 - ZZZZZZ
   - file4.webm

Место назначения:

parent2
 - AAAAAA
   - file1.mp4
 - BBBBBB
   - file2.mp4
 - CCCCCC
   - file3.mp4
 - ZZZZZZ
   - file4.mp4

Есть предложения?

1 Ответ

0 голосов
/ 22 июня 2020

Этот сценарий ищет новый каталог внутри parent1, и если есть новый файл с расширением *.webm, он запускает ffmpeg, который вы разместили для него, и создает ту же структуру каталогов и передает в parent2 с расширением *.mp4.

#!/usr/bin/env bash

find /opt/media/parent2 -type f -name '*.mp4' > parent2_files.txt

fifo="${TMPDIR:-${XDG_RUNTIME_DIR:-/tmp}}/fifo.$$"
trap 'rm -rf "$fifo"' EXIT
mkfifo "$fifo" || exit

check_file() {
  find /opt/media/parent1 -type f -name '*.webm' -exec sh -c '
    for f; do
      f=${f/parent1/parent2}
      f=${f%.webm}.mp4
      echo "$f"
    done
  ' _ {} + | grep -Fvwf parent2_files.txt
}

monitor() {
  while read -r events file; do
    if [[ $events == CREATE && $file == *.webm ]]; then
      return
    fi
  done
}

inotifywait -mrq --format '%e %f' -e create /opt/media/parent1 > "$fifo" & pid=$!

monitor < "$fifo"
kill "$pid"
wait

while read -ru 9 parent2; do
  mkdir -p "${parent2%/*}"
  parent1=${parent2/parent2/parent1}
  parent1=${parent1%.mp4}.webm
  ffmpeg -loglevel panic -acodec libopus -i "$parent1" -strict experimental -movflags faststart "$parent2"
done 9< <(check_file)

"$0"

Структура каталогов по умолчанию.

/opt/
└── media
    ├── parent1
    │   ├── AAAAAA
    │   │   └── file1.webm
    │   ├── BBBBBB
    │   │   └── file2.webm
    │   ├── CCCCCC
    │   │   └── file3.webm
    │   └── ZZZZZZ
    │       └── file4.webm
    └── parent2
        ├── AAAAAA
        │   └── file1.mp4
        ├── BBBBBB
        │   └── file2.mp4
        ├── CCCCCC
        │   └── file3.mp4
        └── ZZZZZZ
            └── file4.mp4

Если новые каталоги добавляются в parent1

/opt/
└── media
    ├── parent1
    │   ├── AAAAAA
    │   │   └── file1.webm
    │   ├── BBBBBB
    │   │   └── file2.webm
    │   ├── CCCCCC
    │   │   └── file3.webm
    │   ├── GGGGGG
    │   │   └── file8.webm
    │   ├── NNNNNN
    │   │   └── file9.webm
    │   ├── PPPPPP
    │   │   └── file7.webm
    │   ├── TTTTTT
    │   │   └── file6.webm
    │   ├── XXXXXX
    │   │   └── file5.webm
    │   └── ZZZZZZ
    │       └── file4.webm

После скрипта.

/opt/
└── media
    ├── parent1
    │   ├── AAAAAA
    │   │   └── file1.webm
    │   ├── BBBBBB
    │   │   └── file2.webm
    │   ├── CCCCCC
    │   │   └── file3.webm
    │   ├── GGGGGG
    │   │   └── file8.webm
    │   ├── NNNNNN
    │   │   └── file9.webm
    │   ├── PPPPPP
    │   │   └── file7.webm
    │   ├── TTTTTT
    │   │   └── file6.webm
    │   ├── XXXXXX
    │   │   └── file5.webm
    │   └── ZZZZZZ
    │       └── file4.webm
    └── parent2
        ├── AAAAAA
        │   └── file1.mp4
        ├── BBBBBB
        │   └── file2.mp4
        ├── CCCCCC
        │   └── file3.mp4
        ├── GGGGGG
        │   └── file8.mp4
        ├── NNNNNN
        │   └── file9.mp4
        ├── PPPPPP
        │   └── file7.mp4
        ├── TTTTTT
        │   └── file6.mp4
        ├── XXXXXX
        │   └── file5.mp4
        └── ZZZZZZ
            └── file4.mp4
  • Идея этого скрипта была взята из Bash FAQ117
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...