2016-10-04 2 views
2

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

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

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

Я пытался работать с этим Баш скрипт, но он терпит неудачу с непечатаемых я угадывание.

#!/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 - Batch convert subfolders

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"

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

ответ

2

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

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

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

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

#!/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.

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

+0

Спасибо Olaf, это выглядит как элегантное решение, но я получаю сообщение об ошибке, когда он пытается добавить X265_ к имени каталога, когда он переходит в первый каталог. Я получаю эту ошибку: 'X265_./Sub Directory/File with Spaces.avi: Нет такого файла или каталога' – Alan

+0

@Alan Это может работать неправильно. Может быть, ему нужно немного возиться с кавычками и убегать, но сейчас я не на своем компьютере, чтобы проверить это. –

+0

Спасибо @Olaf, редактирование, которое вы сделали, получило идеальное решение. – Alan