Пакетное конвертирование видео с помощью ffmpeg при копировании других файлов в иерархии папок - PullRequest
0 голосов
/ 14 октября 2018

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

for f in /path/to/archive/*/*/*.mov; do ffmpeg -i "$f" –c:v libx264 –preset superfast –crf 18 –pix_fmt yuv420p –coder vlc –refs 1 –qmin 4 –c:a libvo_aacenc –b:a 256k –ar 48000 "${f%.mov}.mp4"; done

Но теперь я понятия не имею, как
(a) поместить преобразованный файл .mp4 в параллельную структуру папок на другой диск,
(б) также скопировать другие файлы в структуре.

Структура выглядит следующим образом:

Archive
    2013-05-01
        2013-05-01_08.51.10
            2013-05-01_08.51.10.mov
            2013-05-01_08.51.10.wav
            2013-05-01_08.51.10.txt
        2013-05-01_09.23.47
            2013-05-01_09.23.47.mov
            2013-05-01_09.23.47.wav
            2013-05-01_09.23.47.txt
            2013-05-01_09.23.47.jpg
            (sometimes there are other files and subdirectories too)
        2013-05-01_09.25.23
            ... 
    2013-05-02
        2013-05-02_08.51.10
            2013-05-02_08.51.10.mov
            2013-05-02_08.51.10.wav
            2013-05-02_08.51.10.txt
    ...

В каждой папке есть одно видео, один wav, один txt и, возможно, некоторые другие файлы или подпапки.Я хотел бы воспроизвести всю структуру при замене файлов .mov на преобразованные версии .mp4.
Помощь очень важна!

1 Ответ

0 голосов
/ 14 октября 2018

Я бы пошел косвенным путем: предполагая, что ваши корневые пути

/old
/new

Создайте папку /new/old, а затем просто скопируйте все файлы и папки, кроме .mov, с /old на /new/old.

В командной строке ffmpeg все, что вам нужно изменить, это имя выходного файла:

"new/${f%.mov}.mp4" 

В итоге вы получите всю структуру папок в / new / old.Затем вы перемещаете материал с /new/old на /new, готово.

Прямым решением может быть добавление регулярного выражения перед выполнением команды ffmpeg.

Например, вот так

   for f in /old/*.mov; do
    echo "before substitute:$f";
    outputfilename=${f/\/old/\/new};
    echo "after substitute: $outputfilename";
    ffmpeg -i "$f" –c:v libx264 –preset superfast –crf 18 –pix_fmt yuv420p –coder vlc –refs 1 –qmin 4 –c:a libvo_aacenc –b:a 256k –ar 48000 "$outputfilename.mp4"; 
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...