2

Я работаю над системой Mac в видео компании, где мне нужно очистить множество папок и подпапок, содержащих большие промежуточные видеофайлы.

Поэтому я искал способ пакетного преобразования многих файлов .mov в файлы h.264 .mp4 с помощью ffmpeg. Я нашел несколько кодов для пакетного преобразования, используя скрипт, похожий на

for f in '*.mov';
   do ffmpeg -i $f -c:v libx264 -f mp4 "${%f.mov}.mp4" ; 
done

Однако это работает только в текущей папке, в которой запускается скрипт, в то время как я ищу способ рекурсивного поиска файлов .mov и их пакетного преобразования.

На данный момент решение, которое работает для меня, ощущается немного грубо; Я просто использую поиск и выполнение ffmpeg;

 find . -name '*.mov' -type f -exec ffmpeg -i {} -c:v libx264 -f mp4 {}.mp4 

Тем не менее, одна из проблем, с которыми я сталкиваюсь, заключается в том, что я не могу заменить .mov на .mp4 в этом формате, поэтому вывод добавит .mp4 к {} с файлами, заканчивающимися на * .mov .mp4

Кроме того, я предполагаю, что это не самый безопасный или самый хороший способ рендеринга пакета.

Мне было интересно, есть ли более безопасный или менее терминально интенсивный способ создания пакета для ffmpeg, который мог бы даже решить мою проблему с именами, или способ заставить команду 'for f in * mov' найти видео рекурсивно до 5+ папки глубокие.

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

2 ответа2

2

Вот простой скрипт bash, который будет делать то, что вы хотите (я думаю): 1) рекурсивно найти все файлы MOV и преобразовать их, 2) правильно заменить расширение файла .mov расширением файла .mp4.

#!/bin/bash
while read mov; do
  mp4=$(echo "$mov"|sed -e 's|\.mov$|.mp4|i')
  if [ "$mov" == "$mp4" ]; then
    echo "Failed to generate unique MP4 filename for file $mov"
    exit 1
  fi
  echo ffmpeg -i "$mov" -c:v libx264 -f mp4 "$mp4"
done < <(find . -type f -iname '*.mov')

Как написано, это на самом деле не будет выполнять преобразование, оно просто повторяет команду ffmpeg, которая будет запущена. Если вы уверены, что он будет делать то, что вы хотите, просто удалите "echo" перед командой ffmpeg.

0

это помогает?

for i in `find . -name "*.mov" -print0| xargs -0`; do echo ffmpeg -i $i -c:v libx264 -f mp4 ${i%.mov}.mp4; done

удалите эхо, если вы удовлетворены сгенерированной командой ffmpeg.

это учитывает имена файлов, содержащие один или несколько пробелов (через -print0 и xargs -0)

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