Пакетное повторное кодирование ffmpeg с подпапками

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

Этот работает, пока нет подкаталогов:

#!/bin/bash
for i in *.avi;
do 
    ffmpeg -i "$i" -c:v libx265 -c:a copy X265_"$i"
done

Я пытался работать с этим сценарием bash, но он не работает с пробелами, которые я предполагаю.

#!/bin/bash
inputdir=$PWD
outputdir=$PWD
while IFS= read -r file ; do
  video=`basename "$file"`
  dir=`dirname "$file"`
 ffmpeg -fflags +genpts -i "$file" -c:v libx265 -c:a copy "$dir"/X265_"$video"
done < <(find "$inputdir" -name "*.avi" | head -100)

В этой теме это выглядит как хорошее решение для пользователей Windows, но не для Linux. FFMPEG - Пакетное преобразование подпапок

FOR /r %%i in (*.mp4) DO ffmpeg32 -i "%%~fi" -map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 aac -b:a 128k -ac 2 -strict -2 -cutoff 15000 -c:a:1 copy "%%~dpni(2)%%~xi"

Если вы можете указать мне правильное решение, подходящее для bash, я был бы признателен.

2 ответа

Решение

Это типичный сценарий для find а также xargs

find /path/to/basedir -name '*.avi' -print0 | xargs -0 convert.sh

где -print0 а также -0 обеспечить правильную обработку имен с пробелами.

И в convert.sh у вас есть цикл for, почти такой же, как в вашем первом скрипте

#!/bin/bash

for i; do
    d=$(dirname "$i")
    b=$(basename "$i")
    ffmpeg -i "$i" -c:v libx265 -c:a copy "$d/X265_$b"
done

for i "что-либо" означает то же самое, что "для всех приведенных аргументов", то есть файлы, переданные xargs.

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

С помощью xargs + sh -c, также можно использовать замены скриптов Bourne, передав -I переменная - в этом случае FILE--to sh -c в качестве позиционного параметра, который будет использоваться в качестве $1 расширение:

find . -name '*.flac' -print0 | \
xargs -0 -I FILE \
sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE

Здесь я просто отрубаю расширение.flac ${1%.flac} и добавить m4a.

Другие вопросы по тегам