Екатеринбург
(343) 213 56 67

t2135667@yandex.ru




NVENC H264. быстрое кодирование h264 в Adobe Premiere Pro

Главная | Информация | Использование NVidia GPU для кодирования h264 в Premiere.NVENC.

актуально на 12.2016


Использование NVidia GPU (NVENC_export) для кодирования h264 в Premiere.

Использовать аппаратные возможности видеокарт с CUDA для ускоренного кодирования в h264 начал кодек Main Concept CUDA H.264/AVC, работающий на архитектуре Tesla и Fermi (2хх, 3хх, 4хх, 5хх серии).
Начиная с архитектуры Kepler (6хх и 7хх) NVIDIA разместила на кристалле специальный блок, занимающийся только h264 кодированием. Это поддерживается в ааьзуп и независимым плагином NVENC_export.

Блок кодирования NVENC на видеокарте одинаковый на всех моделях одной архитектуры. Для Kepler его пиковая производительность заявлена как 8-ми кратная к реалтайму, для Maxwell как 16-ти кратная, плюс добавлен YUV4:4:4, для Maxwell 2 (GTX 9x0, GT 750Ti) производительность увеличилась до 60fps для 4K и добавлен h.265 (плагин NVENC_export умеет кодировать в HEVC Main Profile). Для Pascal кодируется 10-бит HEVC, декодируется 10 и 12 битный HEVC и добавлено декодирование VP9 4K, производительность увеличена ещё в два раза. Пиковая производительность достигается на Base профиле, на профиле High*, производительность будет несколько ниже, но не хуже реалтайма. CUDA при кодировании не задействуется и может быть загружено другими операциями.

* Существует три основных профиля H.264: baseline, main, high. Упрощено говоря, baseline наиболее простой нет B-кадров и алгоритма CABAC и он был нужен в основном для старого оборудования с SD разрешением; профиль main переходный; профиль high широко поддержан на HD устройствах. Качество у последнего намного лучше чем у baseline и main, и размер файла намного меньше, но время кодирования дольше. Рекомендуем всегда кодировать на профиле high и с двумя проходами.


Плагин NVENC export H264

Текущая версия плагина 1.11, из-за имеющихся сигналов о несовместимости её с картами на Kepler под Win7, рассмотрим наиболее популярную 1.09.
Скачиваем дистрибутив. Копируем nvenc_export.prm в C:\Program Files\Adobe\Common\Plug-ins\7.0\MediaCore
Драйвера Geforce должны быть новее версии 347.09 (Dec 2014)  и желательно младше 359.0 (Nov 2015). Брать с официального сайта.
Скачиваем и устанавливаем Visual C++ 2013 x64 runtime redistributables
Скачиваем и устанавливаем кодировщик AAC-audio, запоминаем куда установили.
Скачиваем и устанавливаем MP4Box, для мультиплексирования видео и аудио в формат mp4. Запоминаем куда.
Если собираемся кодировать в mkv, то скачиваем и устанавливаем MKVmerge.exe. Запоминаем куда.
Запускаем Premiere и из окна Export Settings импортируем готовые пресеты: их можно найти в папке, куда был установлен плагин. Если плагин устанавливается поверх предыдущей версии, то старые пресеты будут выдавать ошибку, лучше их предварительно удалить.


Во вкладке Multiplexer указываем путь к установленному MP4box или MKVmerge


Во вкладке Audio указываем путь к установленному neroAacEnc.exe


При необходимости меняем битрейт и кадровую частоту.
Наслаждаемся скоростью.

Плагин работает начиная с версий Premiere Pro CS6 и Premiere Elements 12.
Имеются баги: 1. дырки по видео на таймлайне плагин пропускает; на статике (такой как титр, black video, color matte, фотография, etc.) кодируется только один кадр вне зависимости от реальной длительности. При этом звук кодируется нормально и как следствие возникает рассинхрон. Обойти можно, например поставив один ключ анимации на любом из Motion:
nvenc
2. При кодировании с HQ пресетом и AAC звуком, на сборке mp4 происходит ошибка. Такой же сбой происходит на свежих драйверах NVidia. Нужно скачать перекомпилированый плагин или на сообщение об ошибке нажимать Ignore и экспортировать в m4v без мультиплексирования и собирать во внешней программе.

Также есть проблема с Encore - тот транскодирует видео при установке level выше чем 4.0. Проблема в том, что у 4.0 поток ограничен 24 Мбит/с, что не достаточно для 1080i Blu-Ray, а генерируемый NVENC поток 4.1 BD steam, не совместим из-за нестандартного значения VBV size. Значение можно изменить в любом hex-редакторе, но эта операция не тривиальна для видеомонтажеров.Таким образом для Blu-Ray мастеринга плагин пригоден при выборе разрешения до 720p60. В 1.11 эта проблема устранена.
MP4box имеет своё ограничение - в именах файлов не должно быть символа "#".



Main Concept CUDA H.264 - для старого железа

Кодек входит в состав пакетов Rovi TotalCode и Sorenson Squeeze. Кодек устарел и обновляться не будет, поддерживаются старые видеокарты не новее 5хх серии. В более современных видеокартах h.264 кодируется по другому.
Rovi TotalCode технически более продвинутый: в Премьере устанавливается как полноценный движок, участвует в декодирование и кодирование при редактировании и экспорте, подменяя штатные функции на свои. С помощью установленных кодеков, Premiere начинает полноценно понимать mxf и другие вещательные форматы. Поддерживается Premiere CS5.0, 5.5, 6.0, с помощью хака устанавливается на Premiere СС. Windows 8 не поддерживается. По сравнению со штатным импортером свежих версий Premiere, он работает медленее, поэтому без нужды лучше его не устанавливать.
Sorenson Squeeze устанавливается просто как плагин экспорта.
Последние версии пакетов (TotalCode Studio 3.2, Squeeze 10) уже не включают в себя этот кодек.

Драйвера Geforce должны быть ниже версии 340.52, так как начиная с этой версии в драйверах удалена возможность использовать CUDA для кодирования в h.264 (NVCUVENC). Как вариант, если установка старых драйверов не возможна, можно скачать эту динамическую библиотеку и поместить в соответствующие папки (C:\Windows\System32\nvcuvenc.dll и C:\Windows\SysWOW64\nvcuvenc.dll). В последних версиях Premiere интерфейс TotalCode не вызывается, поэтому настроить параметры экспорта можно только из Media Encoder.

Особенностью кодека в том, что он работает на CUDA ядрах и таким образом вступает в конкуренцию с другими программами за использование памяти на видеокарте и за количество доступных ядер CUDA. То есть, работа в Premiere, при кодировании в фоне в Media Encoder видео, будет отрицательно влиять на скорость счета.

Скорость и качество по замерам Rovi: скорость зависит от мощи видеокарты, качество хорошее, лишь на доли процента уступает программному кодеку Main Concept H.264





Экспорт из Premiere через фреймсервер

Многие программы для перекодирования используют ресурсы видеокарт. Большая часть из них делает кодирование с помощью open source проекта ffmpeg. Рассмотрим кодирование в ffmpeg для Премьера: идея следующая - мы можем экспортировать из премьера в формат с легкой и быстрой компресией или лучше вообще без компрессии. Затем запустить перекодирование в ffmpeg. Это можно делать автоматически, и с пользовательской точки зрения это удобно, один раз настроив, дополнительных действий не потребуется. Проблема в том, что размеры некомпрессированных файлов в реальной работе оказываются неприемлимыми. Для решения этой проблемы пойдем по следующему пути - из премьера будем экспортировать через внеший плагин в кодек-фреймсервер (это будет Advanced Frame Server), который создает файл-заглушку и при попытке любой программы читать из этого файла какой-то кадр, будет брать этот кадр с таймлайна премьера и подставлять его в файл. Таким образом размер файла будет равен размеру одного несжатого кадра плюс служебная информация, то есть пренебрежительно малым. Теперь встаёт следующая проблема - ffmpeg не знает такого кодека Advanced Frame Server, и не работает через системные кодеки windows, так как он кроссплатформенный и open source и все кодеки, с которыми он работает, встроены прямо в него. Для решения этой проблемы воспользуемся программой Avisynth, скрипт которой ffmpeg поймет как входной файл, скрипт будет просто указывать на файл-заглушку и ffmpeg через него будет читать из файла-заглушки кадры.

Пошагово нужно:
1. Установить Advanced Frame Server, Avisynth (32-bit), и свежий ffmpeg.
2. Создать Avisynth скрипт frameserver.avs следующего содержания (где "c:\video" - будет рабочей директорией, скрипт тоже должен лежать в ней): AviSource("c:\video\signpost.avi").
3. В Premiere в "Export Settings" выбираем "Format: Advanced Frame Server", следим чтобы опции "Export Video" и "Export Audio" были включены. И выбраны "YUY2" и "Write audio as PCM samples in signpost AVI". Имя файла и путь такие-же как в скрипте Avisynth (signpost.avi в c:\video).
4. Нажимаем "Export". Фреймсервер запустился и готов поставлять кадры.
5. Теперь можно запускать ffmpeg из командной строки используя скрипт Avisynth как входной файл. Пример:
ffmpeg -i c:\video\frameserver.avs -r 25 -c:v h264_nvenc -pix_fmt:v nv12 -preset:v hq -profile:v high -level:v auto -b:v 8000000 c:\video\output.mp4
(для кодирования через Intel Quick Sync надо заменить libnvenc на h264_qsv, или libx264 для желающих кодировать через наиболее качественный кодек - x264)

6. Проверяем получившийся output.mp4: плейеры играют, в Премьер загружается.
7. Делаем вывод, что всё работает. Возможно кому-то будет удобнее использовать какой-то GUI конвертер, например MediaCoder или StaxRip.


Субъективное тестирование

На таймлайн Премьера было положено mp4 видео, 1080p25, длительность 4:49, никаких эффектов.
Система: i7 (4 ядра, HT, 3.07 GHz), GTX680, HDD.
Экспорт делался через: 1) встроенный в Премьер MainConcept h.264; 2 и 3) NVENC_export с VBR 1 проход и 2 прохода; 4) Advanced Frame Server/ MediaCoder в x264, tune - normal, ; 5) Advanced Frame Server/ MediaCoder в libnvenc. 6) плагин x264pro 3amDigitalStudios, tune - film.

Битрейт устанавливался 5 Mbps, профиль high, по возможности VBR 1 проход. На высоких битрейтах качество у кодеков примерно выравнивается, поэтому настройки были выбраны более экстремальные.
Оценка качества проводилась субъективно, покадровым сравнением при увеличении 200%.

кодек время
кодирования
размер
файла, Мб
GPU
%
CPU
%
x264pro.com 7:23 179 0 100
x264 / MediaCoder 6:13 130 0 100
NVENC_export 2 pass 2:36 179 95 25
NVENC_export 1 pass 2:02 178 90 30
Premiere h.264 3:52 178 0 85
libnvenc / MediaCoder 2:03 182 80 45

Результаты в таблице отсортированы по качеству. NVENC_export и встроенный кодек Premiere оказались сопоставимы по качеству, субъективно предпочтение было отдано NVENC_export, но примерно одинаково, x264 ожидаемо дал зримо лучший результат, libnvenc повидимому слабо оптимизирован.
Выводы следующие:
1. для кодирования в высоком разрешении имеет смысл покупать видеокарту последнего поколения (блок NVENC работает на них в разы быстрее);
2. качественное кодирование в x264 доступно из Премьера;
3. аппаратное кодирование освобождает ресурсы для просчета эффектов и трансформаций видео.


Аппаратное ускорение кодирования h264 в других видеоредакторах

Технологии аппаратного кодирования есть у всех основных производителей видеокарт, у Intel это назвается Quick Sync Video, у AMD это Video Codec Engine, у Nvidia это NVENC.
Premiere поддерживает NVENC, плюс старый кодек Main Concept и FrameServer, есть довольно старый плагин от intel, который можно вручную установить на всю линейку CC. Плагин TMPGEnc Movie Plug-in AVC может экспортировать через Quick Sync, также TMPGEnc AVC примечателен также тем, что наиболее полно поддерживает экспорт через x264.
Sony Vegas через Main Concept работают старые AMD, Intel и CUDA карты; Sony AVC не даёт существенного ускорения; возможно кодирование через Debugmode FrameServer
Edius имеет хорошую встроенную поддержку Intel Quick Sync



аппаратное ускорение H264 в adobe premiere, h.264, NVENC, NVidia GPU, Main Concept, Rovi Total Code, Sorenson Squeeze, nvenc кодирование premiere, nvenc_export