Пакетное 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
Другие вопросы по тегам