a_drozdov (a_drozdov) wrote,
a_drozdov
a_drozdov

Categories:

Кодирование H.264 под линукс с использованием Avisynth

На сегодняшний момент самым поддерживаемым железом кодеком для высококачественного видео является H.264 (AVC). Самая лучшая программа кодирования видео в H.264 - это x264 (лучшая в смысле качества получаемого видеопотока).

Но исходный видеопоток для кодирования H.264 надо как-то получить. Очень удобная программа для получения видеопотока, по моему мнению - это Avisynth. Точнее, это даже не программа, а библиотека, с которой могут (или не могут) работать другие программы. С помощью Avisynth можно легко делать подвыборку кадров, наложение и склеивание видеопотоков и пр. Делается это написанием соответствующих скриптов. Прелесть Avisynth состоит в том, что подобные преобразования видеопотоков происходят без потери информации: Avisynth не применяет сжатия с потерями к кадрам, предоставляя заниматься этим кодировщику.

Одно неудобно: Avisynth существует только под Windows. А нам это чудо не нужно: нам надо кодировать под Linux. Но Avisynth всё равно хочется использовать. Ведь Avisynth, на самом деле, соответствует UNIX-way, а то, что он написан для Windows - это ошибка природы (шутка).

Способов 3:
  1. Запустить Windows в виртуалке и кодировать там. Этот способ не очень производительный, как показала практика
  2. Запускать виндовую версию x264 (x264.exe) через wine прямо под Linux. Этот способ существенно быстрее предыдущего, и я им пользовался до недавнего времени. Для удобства лучше всё-таки сначала установить через виртуалку на разделяемой папке программу MeGUI, которая скачивает последние версии всех нужных для подготовки видеопотока программ, и в которой можно подготовить простой вариант скрипта для Avisynth
  3. Использовать родную, линуксовую версию x264, собранную вручную с дополнительными оптимизациями под наш процессор. Этот способ показал наивысшую производительность. О нём я и расскажу ниже.
Итак, как же кодировать способом 3? Опишу поэтапно. Не пугайтесь! Этапы 2-4 и частично 1 надо пройти только один раз.

Этап 1. Подготовка видеопотока

Сначала нужно написать скрипт Avisynth и проверить его работу. Для этого рекомендую установить в виртуалке на разделяемую папку программу MeGUI, через которую также установить все программы для подготовки видеопотока (например, DGIndex для получения видеопотока из DVD для использования в AviSynth). Я не буду тут подробно описывать механизм получения рабочего скрипта Avisynth: это неоднократно описывалось в интернетах. Предположим, что вы, наконец, получили нужный вам скрипт и назвали его v.avs.

Этап 2. Установка Avisynth в Linux

Мы будем использовать Avisynth при помощи wine, поэтому нам придётся установить его и под Linux, а не только в виртуалке. Это делается очень просто: достаточно запустить инсталляционную программу через wine.

Для работы Avisynth из-под wine потребуется дополнительно установить некоторые библиотеки из Visual C++ 6. Это делается так:

$ winetricks vcrun6sp6

Кроме того, некоторые плагины для Avisynth требуют наличия некоторых других библиотек, так что можно сразу установить еще и это:

$ winetricks vcrun2003
$ winetricks vcrun2008
$ winetricks vcrun2005

Этап 3. Установка x264 в Linux

Теперь установим кодировщик в H.264 - программу x264. В различные дистрибутивы Linux эта программа уже включена, и она нам в принципе подойдёт. Но обычно в дистрибутивы входит не самая последняя версия x264, да и собрана она с недостаточными оптимизациями. Поэтому лучше скачать исходные тексты x264 и собрать эту программу самостоятельно. Я не буду описывать процесс сборки x264: просьба погуглить самостоятельно. make install делать нет необходимости: можно сразу после сборки запускать собранный бинарник x264 из каталога, где он собирался. При сборке советую использовать опцию GCC -march, указав именно ваш тип процессора. Также полезна будет опция -funroll-loops. Но вообще тут большое поле для экспериментов. От скорости работы программы x264 напрямую зависит скорость кодирования, так что чем больше вы выгадаете в скорости дополнительными опциями оптимизации при сборке, тем лучше.

Этап 4. Установка Avs2YUV

Теперь будем устанавливать Avs2YUV. Зачем это нужно? Дело в том, что сборка x264 для Windows (программа x264.exe) умеет работать со скриптами Avisynth, открывая их библиотеками Avisynth. Но наша супероптимизированная линуксовая версия x264 не умеет работать напрямую со скриптами Avisynth, так что нельзя просто указать x264 использовать в качестве входного видеопотока наш файл v.avs. К счастью, x264 может работать со входными потоками YUV4MPEG, а программа Avs2YUV как раз тем и занимается, что по скрипту Avisynth выдаёт поток YUV4MPEG.

Программа Avs2YUV тоже написана для Windows (иначе и быть не может, т.к. она должна использовать библиотеки Avisynth). Установка её сводится к простой распаковке архива.

Этап 5. Кодирование

Наконец, у нас всё подготовлено для кодирования!

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

Если вы выбрали кодирование в два прохода, то вот приблизительный скрипт для этого:

#!/bin/sh

AVS2YUV="wine <путь_до_AVS2YUV>/avs2yuv.exe v.avs -"

NFRAMES=`($AVS2YUV | ( pwd > /dev/null ) ) 2>&1 | awk '{if (NR==1) {print $5}}'`
FRAMES="--frames $NFRAMES"

X264_CMD="<путь_до_x264>/x264"
OPTIONS="--preset placebo --bitrate 1900 --bframes 6 --ref 6 --deblock 0:0 --ratetol 4.0 --qpmin 10"
# Это опции для определения приблизительного bitrate
# OPTIONS="--preset placebo --crf 18 --bframes 16 --ref 16 --deblock 0:0 --ratetol 4.0 --qpmin 10"

OPTS_FULL="$OPTIONS $FRAMES --stats ".stats" --output r.mkv --demuxer y4m"

$AVS2YUV | $X264_CMD $OPTS_FULL --pass 1 -
$AVS2YUV | $X264_CMD $OPTS_FULL --pass 2 -

# Это используйте при определении приблизительного bitrate (при однопроходном кодировании)
#$AVS2YUV | $X264_CMD $OPTS_FULL -

Как видно, программа avs2yuv выдаёт несжатый видеопоток на стандартный выход (stdout), а x264 принимает этот поток на стандартном входе (stdin). При этом для x264 обязательно требуется указывать параметр --demuxer y4m, чтобы x264 понял, что входной поток - YUV4MPEG. К сожалению, программа x264 не может автоматически определить количество кадров (фреймов) по такому входному потоку, поэтому не будет отображать приблизительное время до завершения кодирования. Если же вы попытаетесь сохранять вывод avs2yuv в отдельный файл, чтобы потом обработать этот файл x264, то обнаружите, что этот файл будет слишком объёмным, ведь вспомним, что Avisynth выдаёт нам несжатый видеопоток. Поэтому avs2yuv надо связывать с x264 без промежуточных файлов. К счастью, программа avs2yuv печатает на нашей консолечке количество кадров, чем мы и воспользовались, запустив avs2yuv первый раз в broken pipe и сохранив распечатанное на stderr число кадров в переменной NFRAMES. Передавая далее число кадров в x264, мы начинаем видеть время до завершения кодирования.

Запускать скрипт желательно с низким приоритетом, чтобы кодирование не мешало работе за компьютером. Делается это при помощи программы nice.

Спасибо за внимание!
Subscribe

  • Avisynth + Linux: альтернативный вариант кодирования h264

    По моей предыдущей статейке меня посетила идея, как можно улучшить совместимость Avisynth с Linux. Проблема в том, что не все фильтры хорошо…

  • Прекрасная любовь

    А лирика Шевчука всё-таки хороша...

  • (no subject)

    Почти 7 лет назад я создал этот журнал. Сегодня решил сделать себе аватарку. Тревожный признак, по-моему: если так дальше пойдёт, то через 30 лет я…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments