Пакетное avconv перекодирует видео в середине списка
Поскольку у меня недорогой компьютер под управлением Linux, мне часто приходится перекодировать HD-видео, снижая качество, чтобы иметь возможность просматривать их на своем компьютере. Типичный случай, когда я загружаю несколько эпизодов серии, я не могу конвертировать их все сразу, и мне нужно начать перекодирование в середине серии.
Обычно я использую эту строку для преобразования одного эпизода в более низкое качество:
avconv -i anime_episode_01.mkv -map 0 -c copy -c:v libx264 -crf 31 anime_01.mkv
Если бы я конвертировал их сразу, я бы использовал что-то вроде:
for i in *.mkv;do avconv -i "$i" -map 0 -c copy -c:v libx264 -crf 31 "encoded/$i";done
куда encoded
это подкаталог.
Но что, если мне нужно начать перекодирование, скажем, в эпизоде 5?
Я понятия не имею.
1 ответ
Вероятно, есть много способов сделать это, вот несколько вариантов.
Вариант 1: использованиеseq
использование seq
чтобы создать последовательность, зациклите ее и закодируйте.
Последовательность от 5 до 15:
seq 5 15
Если вам нужно отформатировать числа, например, чтобы получить префикс 0 для однозначных чисел, вы можете использовать -f
switch, который принимает аргумент форматирования в стиле printf типа float/double.
seq -f %02.0f 5 15
Это может быть использовано в цикле, например что-то вроде этого:
for i in $(seq -f %02.0f 5 15); do
filename="anime_episode${i}.mkv"
echo "Encoding episode $i: $filename"
avconv -i "$filename" -map 0 -c copy -c:v libx264 -crf 31 "encoded/$filename"
done
Вариант 2. Проверьте, существует ли закодированный файл
Делайте то же самое, что и в текущем цикле, но выполняйте кодирование, только если закодированный файл еще не существует.
for i in *.mkv; do
if [ ! -f encoded/$i ]; then
echo "Encoding file: $i"
avconv -i "$i" -map 0 -c copy -c:v libx264 -crf 31 "encoded/$i"
else
echo "Skipped file: $i"
fi
done