Аппаратное ускорение NVIDIA
Если на вашем компьютере установлена одна из последних моделей видеокарт NVIDIA®, вы можете использовать мощность ее графического процессора при конвертации видео. Использование видеокарты вместо процессора позволяет вам оставлять процессор для других задач и свободно использовать компьютер во время конвертации.
Как использовать ускорение NVIDIA
Ускорение NVIDIA можно использовать при конвертации видео в форматы AVI, MP4, FLV, MOV или MPEG-2 TS с кодеком H.264. Для этого выберите профиль со значком NVIDIA® CUDA или NVIDIA® NVENC.

Совместимые модели видеокарт
Ускорение NVIDIA поддерживают видеокарты серий GeForce, Tesla и Quadro. Вы можете ознакомиться с полным списком на официальном сайте NVIDIA: Видеокарты с поддержкой CUDA | Видеокарты с поддержкой NVENC .
Подсказка: мобильные видеокарты не поддерживают ускорение NVIDIA.
Использование видеокарты вместе с процессором
Если вы не планируете использовать компьютер во время конвертации, вы можете включить конвертацию с использованием процессора и видеокарты одновременно. Это значительно ускорит процесс конвертации, но увеличит нагрузку на компьютер. Для этого выберите опцию Параллельная конвертация ЦП и NVIDIA GPU в настройках конвертации .
Устранение проблем
Как узнать, какой графический процессор у моего компьютера?
1. Кликните правой кнопкой мыши по рабочему столу и в появившемся меню выберите Разрешение дисплея.
2. В появившемся окне нажмите Расширенные настройки. Откроются параметры GPU.
3. В разделе Вид адаптера вы можете найти модель вашего GPU’s.
Невозможно включить ускорение NVIDIA в настройках
Если функция ускорения NVIDIA недоступна в настройка, попробуйте обновить драйверы вашей видеокарты..
Использование GPU (NVidia/NVENC_export/Voukoder, Intel/QSV, AMD/VCE) для кодирования h264 видео в Premiere.
Использовать аппаратные возможности видеокарт с CUDA для ускоренного кодирования в h264 начал кодек Main Concept CUDA H.264/AVC, работающий на архитектуре Tesla и Fermi (2хх, 3хх, 4хх, 5хх серии) .
Начиная с архитектуры Kepler (6хх и 7хх) NVIDIA разместила на кристалле специальный блок, занимающийся только кодированием видео в ряд форматов, наиболее важный из которых на практике это h.264. Использовать это в Премьере можно с плагинами экспорта NVENC_export, Voukoder или фрейм-сервер с выводом в программы-конвертеры.
Блок кодирования NVENC на видеокарте одинаков на всех моделях одной архитектуры*. Для Kepler его пиковая производительность (на Base профиле) заявлена как 8-ми кратная к реалтайму, т.е за минуту времени можно закодировать 8 минут видео 1080p/30 fps, на профиле High скорость кодирования 2х реалтайма. Для Maxwell производительность удвоена, плюс добавлен YUV4:4:4, Maxwell 2 (GTX 9×0, GT 750Ti) в полтора раза быстрее, добавлено кодирование 4К/60fps, добавлен h.265 (плагин NVENC_export умеет кодировать в HEVC Main Profile). Pascal кодирует ещё в полтора раза быстрее, поддерживается до 12 бит и 8K в HEVC. Turing быстрее на 25%, поддерживается HEVC 8K 4:4:4, и, по заявлению NVidia, существенно улучшено качество кодирования. В общем случае CUDA при кодировании не задействуется и может быть загружено другими операциями, но поскольку на кристалле поддержка стандартов кодирования может быть не полной, часть процесса, в зависимости от версии блока nvenc и версии драйверов, может выполняться с использованием ресурсов CPU и CUDA.
Технология Intel Quick Sync впервые появилась в некоторых процессорах Sandy Bridge в 2011 г. Начиная с серии SkyLake стал поддерживаться h.265/HEVC, у Kaby Lake появился VP9. На первоначальном этапе Intel даже написала плагин для Премьера, однако он показал не слишком впечатляющие результаты в скорости/качестве и был забыт. Начиная с CC 2017.1 в Премьере есть штатная поддержка Quick Sync.
* есть исключения: NVIDIA GT 1030 и ряд мобильных чипсетов не имеют блока NVENC, на GTX 1080 Ti и Titan X по 2 блока NVENC, на Titan V — 3 блока.
** Существует три основных профиля H.264: baseline, main, high. Упрощено говоря, baseline наиболее простой нет B-кадров и алгоритма CABAC и он был нужен в основном для старого оборудования с SD разрешением; профиль main переходный; профиль high широко поддержан на HD устройствах. Качество у последнего намного лучше чем у baseline, и размер файла намного меньше, но время кодирования дольше. С NVENC Рекомендуем всегда кодировать на профиле high и с двумя проходами.
Плагин Voukoder
Voukoder это бесплатный плагин экспорта на основе ffmpeg. Поддерживается аппаратное ускорение кодирования видеокартами NVidia, AMD, Intel QSV. Достоинством являются хорошая совместимость с различными версиями Премьера (от CS6 до СС2020) и разными поколениями видеокарт. Кроме аппаратных кодеров h264/hevc в нём поддержаны кодеры x264, x265, prores, VP8, VP9, FFV1, HAP; контейнеры mp4, Matroska, mov, webm. Настройки сравнительно простые и логичные. Крое премьера работает с Vegas Pro.
Есть особенность в CC 2017 — из-за имеющегося бага в Премьере, nvenc кодировщики не работают.
Плагин Cinegy Turbocut (Daniel2)
Этот плагин от компании Cinegy рассчитан на работу с видеокартами NVidia и включает в себя два кодека — один в своем собственном формате Daniel2, являющимся функциональным аналогом ProRes, и второй — полностью аппаратно ускоренный (импорт и экспорт) для видеокарт с nvenc/nvdec. То есть плагин не только аппаратно ускоряет экспорт, но и аппаратно ускоряет декодирование h264/hevc материала при работе на таймлайне, что существенно ускоряет работу с тяжелым материалом.
Встроенная поддержка в Premiere
В версии CC2020 14.2 есть штатная возможность аппаратного кодирования h264/hevc на соответствующих видеокартах NVidia/AMD/Intel. Плагины с таким функционалом существуют 5 лет и более. Качество между встроенным кодировщиком и плагиноми — одинаковое на одинаковых видеокартах при одинаковых настройках
История: начиная с версии 2017.1 Premiere начал использовать интегрированное видео процессоров Intel с QSV для кодирования h.264. В Премьере 2018.1 достаточно включить в панели экспорта опцию Hardware Accelerated (С аппаратным ускорением), причем для Mac будет доступно аппаратное кодирование и в формат h.265. Для версии 2017 это включается через панель скрытых настроек Debug Database View (нажать Ctrl + F12). Строки HWEncodeEnable и ISD.IntelDecoder.UseHwAccEncoding нужно установить в состояние true. После этого экспортируя видео обычным способом через панель Export, вместо процессора работает блок QSV. Скорость возрастает в 2-3 раза.
Также в CC2017 была сделана попытка применить кодирование Nvidia, но судя по отзывам, включение скрытых настроек практически ни у кого не заработало. К сожалению эта версия Премьера забирала ресурсы nvenc в монопольное использование, что не давало работать другим плагинам экспорта, таким как Voukoder. Есть неофициальный патч к премьеру, но мы им никогда не пользовались и ничего про него сказать не можем, проще не использовать CC 2017.
Строка HWEncodeEnable появилась ещё в CC 2015, но тогда никакого действия не имела. Строка ISD.IntelDecoder.UseHwAccEncoding является специфичной для интеловской графики. Для Nvidia с 2019.1 появилась строка ExporterMPEG4.Feature.AllowNVidiaHWExport, и в CC2020 это работает как штатный кодировщик.
Плагин NVENC export H264
Плагин работает только с видеокартами NVidia, является достаточно качественным инструментом, на низких битрейтах показывающий лучшее качество чем штатный кодер Premiere. Будучи первым в использовании nvenc для Премьера, он давно не обновлялся и в целом устарел. Наиболее проблемным моментов в работе с ним это поиск подходящей версии для конкретной конфигурации монтажного компьютера.
Последняя авторская версия плагина 1.12, достаточно популярен 1.11 (работает только на процессорах с AVX), в этой статье рассмотрим версию 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 импортируем готовые пресеты: их можно найти в папке, куда был установлен плагин. Если плагин устанавливается поверх предыдущей версии, то старые пресеты будут выдавать ошибку, лучше их предварительно удалить.
Готовый preset можно доработать под себя: например включить B-frames, это хорошо сохраняет качество на низких битрейтах.
Во вкладке Multiplexer указываем путь к установленному MP4box или MKVmerge
Во вкладке Audio указываем путь к установленному neroAacEnc.exe
При необходимости меняем битрейт и кадровую частоту.
Наслаждаемся скоростью. Экспорт идет в три приёма: кодирование видео nvenc, кодирование звука aac, мультиплексирование (совмещение в один файл) видео и звука.

Плагин работает начиная с версий Premiere Pro CS6 и Premiere Elements 12.
Имеются баги: 1. дырки по видео на таймлайне плагин пропускает; на статике (такой как титр, black video, color matte, фотография, etc.) кодируется только один кадр вне зависимости от реальной длительности. При этом звук кодируется нормально и как следствие возникает рассинхрон. Обойти можно, например поставив один ключ анимации на любом из Motion:
2. При кодировании с HQ пресетом и AAC звуком, на сборке mp4 происходит ошибка. Такой же сбой происходит на свежих драйверах NVidia. Нужно скачать перекомпилированый плагин или на сообщение об ошибке нажимать Ignore и экспортировать в m4v без мультиплексирования и собирать во внешней программе.
Для 1.11 нужно скачивать и устанавливать Visual C++ 2015 x64 runtime redistributables. Поскольку плагин написан под старые драйвера, он может выдавать сообщение об ошибке, на которое можно просто нажать Ignore.
На некоторых конфигурациях в CC2018 необходимо отключить скрытую опцию HWEncodeEnable. Для этого надо нажать ctrl-F12 и перейти по console >Debug>HWEncodeEnable
Также есть проблема с Encore — тот транскодирует видео при установке level выше чем 4.0. Проблема в том, что у 4.0 поток ограничен 24 Мбит/с, что не достаточно для 1080i Blu-Ray, а генерируемый NVENC поток 4.1 BD steam, не совместим из-за нестандартного значения VBV size. Значение можно изменить в любом hex-редакторе, но эта операция не тривиальна для видеомонтажеров.Таким образом для Blu-Ray мастеринга плагин пригоден при выборе разрешения до 720p60. В 1.11 эта проблема устранена.
MP4box имеет своё ограничение — в именах файлов не должно быть символа «#».
Экспорт из Premiere через фреймсервер
Существует ряд программ-конверторов работающих с аппаратным ускорением видеокарт. Многие из них делают кодирование с помощью open source проекта ffmpeg. Это универсальное способ задействовать аппаратное кодирование на NVidia, AMD, Intel.
Рассмотрим кодирование в 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
Синтаксис может меняться в зависимости от версии ffmpeg. Также для кодирования через Intel Quick Sync надо заменить libnvenc на h264_qsv, или libx264 для желающих кодировать через наиболее качественный кодек — x264.
6. Проверяем получившийся output.mp4: плейеры играют, в Премьер загружается.
Делаем вывод, что всё работает. Возможно кому-то будет удобнее использовать какой-то GUI конвертер, например MediaCoder или StaxRip.
Из-за того что работа ведётся через два фрейм сервера, общая скорость кодирования примерно в два раза ниже чем у nvenc_export и Voukoder.
Субъективное тестирование
Самым качественным кодером h264 является x264. x264 имеет широкие настройки, на определенных настройках он может кодировать очень быстро, но не очень качественно. На других очень качественно, но очень медленно. Критерием качества является собственно визуальное качество при минимальных размерах файла. Первенство x264 бесспорно, поэтому из сравнения его исключаем. NVENC_export имеет слишком много проблем с совместимостью в разных конфигурациях, и с выходом Voukoder потерял актуальность. Поэтому из сравнения он исключается тоже. Сравнивались Voukoder, StaxRip (NVEncC by rigaya) и штатный Main Concept H.264.
Кодировался ролик 1080p25, битрейт устанавливался 4 Mbps, профиль high, VBR 2 прохода, материал — уличная съемка примягком освещении. На высоких битрейтах качество у кодеков примерно выравнивается, поэтому настройки битрейта были выбраны более экстремальные.
Оценка качества проводилась субъективно по мелким деталям, покадровым сравнением с оригиналом и между собой при увеличении 200%.
Лучшее качество показал StaxRip. Main Concept слишком сглаживает, третьим идёт Voukoder. Все три кодека визуально сопоставимы по качеству, разницу заметить трудно. Лучший по скорости — Voukoder.
Выводы следующие:
1. NVENC кодеки не уступают встроеному в Премьер энкодеру, а в случае низких настроек качества кодирования встроеного энкодера, NVENC будет лучше качеством при меньшем размере и в разы меньшем времени кодирования.
2. для кодирования в высоком разрешении имеет смысл покупать видеокарту последнего поколения (блок NVENC работает на них в разы быстрее);
3. аппаратное кодирование освобождает ресурсы для просчета эффектов и трансформаций видео.
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 CC2014+ интерфейс TotalCode не вызывается, поэтому настроить параметры экспорта можно только из Media Encoder.
Особенностью кодека в том, что он работает на CUDA ядрах и таким образом вступает в конкуренцию с другими программами за использование памяти на видеокарте и за количество доступных ядер CUDA. То есть если одновременно монтировать в Premiere и в фоне экспортировать через Media Encoder, то скорость экспорта бедет медленнее.
Скорость и качество по замерам Rovi: скорость зависит от мощи видеокарты, качество хорошее, лишь на доли процента уступает программному кодеку Main Concept H.264
Полезные ссылки
https://www.voukoder.org/forum/thread/592-good-x264-settings-may-2020-update-2/
https://developer.nvidia.com/nvidia-video-codec-sdk
https://github.com/streamlinevideo/streamline
аппаратное ускорение H264 в adobe premiere, h.264, NVENC, NVidia GPU, Main Concept, Rovi Total Code, Sorenson Squeeze, nvenc кодирование premiere, nvenc_export, Voukoder, voukoder как включить видеокарту, что такое h.264
Аппаратное ускорение NVIDIA
Включение конвертации с использованием NVIDIA GPU
С включенной опцией ваша видеокарта NVIDIA будет использована при конвертации видео с кодеками H.264 и MPEG-2. Видео будут обрабатываться до 50% быстрее.
Использование видеокарты вместо процессора позволяет вам оставлять процессор для других задач и свободно и использовать компьютер для других целей во время конвертации.
Эта опция доступна, только если ваш компьютер оборудован видеокартой NVIDIA с поддержкой технологии CUDA™ или NVENC™.
В списке форматов для конвертацией ищите профили со значком NVIDIA NVENC или NVIDIA CUDA, в зависимости от технологии ускорения, которую поддерживает ваша видеокарта.

Совместимые модели видеокарт
Ускорение NVIDIA поддерживают видеокарты серий GeForce, Tesla и Quadro. Вы можете ознакомиться с полным списком на официальном сайте NVIDIA: Видеокарты с поддержкой CUDA | Видеокарты с поддержкой NVENC .
Примечание: мобильные видеокарты не поддерживают ускорение NVIDIA.
Устранение проблем
Как узнать, какой графический процессор у моего компьютера?
Кликните правой кнопкой мыши по рабочему столу и в появившемся меню выберите Разрешение дисплея.
В появившемся окне нажмите Расширенные настройки. Откроются параметры GPU.
В разделе Вид адаптера вы можете найти модель вашего GPU’s.
Невозможно включить ускорение NVIDIA в настройках
Если функция ускорения NVIDIA недоступна в настройка, попробуйте обновить драйверы вашей видеокарты..
Быстрое кодирование видео в Linux c Nvidia NVENC с SDK 7.5 и ffmpeg 3.0.2 на Nvidia GTX 960/970/980

Данная статья была написана по мотивам статьи Эффективное кодирование видео в Linux c Nvidia NVENC: часть 1, общая, однако имеет свои особенности и в отличие от оригинальной статьи, на момент написания которой не было выпущено патча, о котором пойдет речь дальше, я применил переработанный патч Nvidia Acceleration к FFmpeg 3.0.2, получив помимо энкодера nvenc еще и быстрый фильтр ресайза — nvresize.
В итого я получил возможность аппаратно кодировать видео в H.264 и HEVC при помощи видеокарты Nvidia GTX 960 на достаточно слабом компьютере (Xeon L5420) со скоростью (для H.264), превышающей возможности данного процессора до 10 раз (и в 3 раза относительно Core i7)! Причем на моем любимом Debian 8 Jessie.
Технология
Nvidia NVENC это технология, обеспечивающая кодирование видео в H.264 и HEVC на вычислительных мощностях GPU. Важное замечание: сколь-нибудь качественное и быстрое кодирование на момент написания статьи (май 2016) могут обеспечить только карты второго поколения Maxwell, и для десктопных это: GM206 (GTX 950, GTX 960), GM204 (GTX 970 и GTX 980) (для справки: есть еще дорогие проф.линейки Nvidia Tesla/Quadro/GRID, полный перечень можно найти здесь). Причем NVENC модуль работает с одинаковой скоростью на всех картах и количество CUDA ядер не влияет на производительность, как бы странно это не звучало, поэтому брать старшие версии имеет смысл только если платформа используется (помимо кодирования) для игр, даже более того, карты на GM206 целесообразнее т.к. помимо энкодера, получили еще и аппаратный HEVC декодер. Важное примечание: вся линейка GeForce имеет лицензионное ограничение в 2 одновременных потока. Его можно попробовать обойти методом, указанным во второй части статьи YourChief
Реализация (FFmpeg)
Все многообразие реализаций Nvidia CUDA можно посмотреть по ссылке. От себя хочу сказать что для видео наиболее распространенным является популярный инструмент — FFmpeg. Его мы и будем использовать.
Аппаратное обеспечение
- Материнская плата: с поддержкой PCI-E. Рекомендую платформу Intel из-за тесной связи Intel-Nvidia и личной приязни. Да простят меня поклонники AMD!
- Процессор: двухядерный, уровня не ниже Core2 Duo. Рекомендую Core i3 и некоторые дешевые Xeon (да-да!).
- Память: DDR2/3/4, минимум 2 Гб. Интересный факт, при двух потоках кодирования суммарное потребление памяти у меня ~0.7 Гб.
- Видеокарта: любая видеокарта Nvidia 900 Series (Рекомендую GM206: GTX 950, GTX 960 или GM204: GTX 970, GTX 980). 2 Гб или 4 Гб, геймерская или нет — не важно! Главное, следите за габаритами и учтите что у всех моделей GTX 960 что я видел, дополнительное питание подключается сверху.
- БП ATX с доп.коннектором питания (6 пин для нашей задачи хватит). Рекомендую мощность не менее 400 Вт.
Программное обеспечение
- Операционная система: Debian 8 Jessie с дополнительным репозиторием Deb Multimedia
- Nvidia CUDA 7.5.18
- Nvidia SDK 6.0.1
- FFmpeg 3.0.2
- Патч Nvidia Acceleration, изменен мной для совместимости с FFmpeg 3.0.2
Сборка
Самый важный из файлов — это первый, с драйвером. Только он и нужен если вы сразу хотите установить пакет после его сборки.
Скачиваем файлы, которые нам понадобятся для дальнейшей работы. Размер ~1.3 Гб.
cd /usr/src wget 'http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_linux.run' wget --no-check-certificate 'https://developer.nvidia.com/video-sdk-601' -O 'video-sdk-601.zip' wget 'http://developer.download.nvidia.com/compute/redist/ffmpeg/1511-patch/cudautils.zip' wget 'http://ffmpeg.org/releases/ffmpeg-3.0.2.tar.bz2' wget 'http://kuzko.com/dl/ffmpeg_NVIDIA_gpu_acceleration.3.0.2.patch'
MD5 файлов
4b3bcecf0dfc35928a0898793cf3e4c6 cuda_7.5.18_linux.run 24af45272ed2881f88ed534d3211b584 video-sdk-601.zip f3f890bd314a568c47191810453cad2c cudautils.zip 7db5efb1070872823143e1365fdfcd53 ffmpeg-3.0.2.tar.bz2 a4f59f92675e02a0fa5c6cd124eda64e ffmpeg_NVIDIA_gpu_acceleration.3.0.2.patch
SHA1 файлов
0f366a88968b9eee01044de197e27764bc1567d6 cuda_7.5.18_linux.run e57c7b4cfb298d4c725a0bb4477928e228dabb1c video-sdk-601.zip edc818bef432d708466c5454974b9851523a86ba cudautils.zip c40731a221fbfaa50671d69fe894bedd664f91e2 ffmpeg-3.0.2.tar.bz2 f305832ed42beeff7d7c26a00f79668b63b322ec ffmpeg_NVIDIA_gpu_acceleration.3.0.2.patch
Добавляем репозиторий Deb Multimedia (он требуется если вы хотите получить/использовать FFmpeg, который максимально приближен к тому, который выкладывает Deb Multimedia). Этот репозиторий обязателен для моей сборки!
Для ленивых
Создаем файл с одной строчкой:
echo -e 'deb http://www.deb-multimedia.org jessie main non-free\ndeb http://www.deb-multimedia.org jessie-backports main' > /etc/apt/sources.list.d/deb-multimedia.list
Далее выполняем
apt-get update
И устанавливаем keyring:
apt-get install deb-multimedia-keyring
Теперь обновляем систему и ставим требуемые для сборки драйвера пакеты. Этот шаг также необходим!
Необходимые действия
apt-get update apt-get -y dist-upgrade apt-get -y install build-essential checkinstall dkms ccache pkg-config libglu1-mesa-dev libx11-dev libxi-dev libxmu-dev libxcb-shm0
Устанавливаем Nvidia Driver, принимаем соглашение (accept), все остальные ответы по-умолчанию. Если предупредят что система не является подходящей, не переживайте, это нормально! Можно передать ключ -silent для быстрой установки, но лучше пройдитесь сами.
Необходимые действия
cd /usr/src chmod +x cuda_7.5.18_linux.run ./cuda_7.5.18_linux.run
Выбор дальнейшего действия зависит от вас. Вы можете либо довериться мне и скачать готовый deb файл (создан через checkinstall) и пропустить последующие шаги, либо осуществить сборку вручную, установив необходимые библиотеки и собрав пакет самостоятельно через checkinstall.
Я джедай, чего мне бояться?
cd /usr/src wget 'http://kuzko.com/dl/ffmpeg_3.0.2-nvenc-7.5.18-nvresize-cudautils-20160523-1_amd64.deb' dpkg -i ffmpeg_3.0.2-nvenc-7.5.18-nvresize-cudautils-20160523-1_amd64.deb apt-get -f install
Если вы выбрали светлую сторону силы, то давайте продолжим, установим библиотеки, требуемые для сборки (для этого помимо всего прочего и был нужен Deb Multimedia), подготовим заголовочные файлы, cudautils и применим патч:
Необходимые действия
apt-get install -y --force-yes unzip libfdk-aac-dev libopencv-dev libiec61883-dev libavc1394-dev libass-dev libbluray-dev libbs2b-dev libkvazaar-dev libilbc2 libilbc-dev libopenh264-dev libsnappy-dev libsoxr-dev libxv1 libxcb-shape0 libxcb-shm0 yasm frei0r-plugins-dev libgnutls28-dev libopenjpeg-dev libopus-dev libpulse-dev librtmp-dev libspeex-dev libutvideo-dev libvidstab-dev libvo-amrwbenc-dev libvpx-dev libx265-dev libzvbi-dev libssl-dev libcdio-dev libcdio-paranoia-dev cd /usr/src unzip video-sdk-601.zip; /bin/cp -prf nvidia_video_sdk_6.0.1/Samples/common/inc/nvCPUOPSys.h /usr/include /bin/cp -prf nvidia_video_sdk_6.0.1/Samples/common/inc/nvEncodeAPI.h /usr/include /bin/cp -prf nvidia_video_sdk_6.0.1/Samples/common/inc/nvFileIO.h /usr/include /bin/cp -prf nvidia_video_sdk_6.0.1/Samples/common/inc/NvHWEncoder.h /usr/include /bin/cp -prf nvidia_video_sdk_6.0.1/Samples/common/inc/nvUtils.h /usr/include unzip cudautils.zip cd cudautils make cd /usr/src tar jxf ffmpeg-3.0.2.tar.bz2 cd ffmpeg-3.0.2 sed -i 's/ctx->outputs\[i\]->closed/ctx->outputs\[i\]->status/g' ../ffmpeg_NVIDIA_gpu_acceleration.3.0.2.patch patch -Np1 -i ../ffmpeg_NVIDIA_gpu_acceleration.3.0.2.patch
- Были добавлены —enable-nvenc и —enable-nvresize (куда же без них!)
- Модифицированы —extra-cflags и —extra-ldflags, чтобы включить в себя cudautils
- Убраны —enable-opencl (не смог найти библиотеку для него) и —enable-libtesseract (лишний модуль на мой взгляд)
- FFmpeg собирается без —enable-shared, хотя ничто не мешает вам его вернуть назад
- make -j10 можете менять на специфичное для вашей системы (я использовал build-машину, где threads+2=10)
- Зависимости в checkinstall я вставил для того, чтобы при установке с нуля, было достаточно выполнить apt-get -f install и установить требуемые пакеты, а не выискивать через ldd что-же еще нужно установить
- Также из-за несовершенства checkinstall пришлось выполнить несколько необязательных действий (удаление конфликтующих dev пакетов и создании папки /usr/share/ffmpeg)
Итак, идем за кофе, но только после отработки configure
cd /usr/src cd ffmpeg-3.0.2 ./configure --prefix=/usr --extra-cflags='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -I../cudautils ' --extra-ldflags='-Wl,-z,relro -L../cudautils ' --cc='ccache cc' --enable-libmp3lame --enable-gpl --enable-nonfree --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --enable-libvpx --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-librtmp --enable-avfilter --enable-libfreetype --disable-decoder=amrnb --enable-libvo-amrwbenc --libdir=/usr/lib/x86_64-linux-gnu --disable-vda --enable-libbluray --enable-libcdio --enable-gnutls --enable-frei0r --enable-openssl --enable-libass --enable-libopus --enable-fontconfig --enable-libpulse --disable-mipsdsp --disable-mips32r2 --disable-msa --disable-mipsfpu --disable-mipsdspr2 --enable-libvidstab --enable-libzvbi --enable-avresample --enable-libutvideo --enable-libfdk-aac --enable-libx265 --enable-libbs2b --enable-libilbc --enable-libopenh264 --enable-libkvazaar --enable-libsnappy --enable-libsoxr --enable-libiec61883 --enable-vaapi --enable-libdc1394 --disable-altivec --shlibdir=/usr/lib/x86_64-linux-gnu --enable-nvenc --enable-nvresize make -j10 apt-get -y remove libswscale-dev libavcodec-dev libswresample-dev libavutil-dev mkdir -p /usr/share/ffmpeg checkinstall --pkgname=ffmpeg --pkgversion "10:3.0.2-nvenc-7.5.18-nvresize-cudautils-`date +%Y%m%d`" --backup=no --requires='libcdio-paranoia1,libjack0,libasound2,libsdl1.2debian,libdc1394-22,libavc1394-0,libiec61883-0,libvidstab1.0,libbs2b0,libva1,libzvbi0,libx265-79,libx264-148,libvpx1,libvo-amrwbenc0,libutvideo15,libtheora0,libspeex1,libsoxr0,libsnappy1,libschroedinger-1.0-0,libopus0,libopenjpeg5,libopenh264-1,libopencore-amrwb0,libopencore-amrnb0,libmp3lame0,libkvazaar3,libilbc2,libgsm1,libfdk-aac1,libfaac0,libbluray1,libass5,libxcb-xfixes0,libcrystalhd3,libxvidcore4,libxv1,libxcb-shape0,libxcb-shm0' --default
Если в результате вы получили deb файл, то принимайте мои поздравления!
Кстати, checkinstall может и ругнуться при установке пакета. Не страшно. Установите (если не установился) пакет вручную через dpkg -i ffmpeg_3.0.2-nvenc-7.5.18-nvresize-cudautils-20160523-1_amd64.deb и потом apt-get -f install для установки зависимостей.
Параметры nvenc и nvresize
Отчего-то, не все знают какие параметры принимает nvenc и nvresize, а для этого нужно всего лишь запустить ffmpeg с ключом -h:
ffmpeg -h encoder=nvenc_h264
Encoder nvenc_h264 [NVIDIA NVENC h264 encoder]: General capabilities: delay Threading capabilities: none Supported pixel formats: yuv420p nv12 nvenc_h264 AVOptions: -preset E..V. Set the encoding preset (one of slow = hq 2pass, medium = hq, fast = hp, hq, hp, bd, ll, llhq, llhp, default) (default "hq") -profile E..V. Set the encoding profile (high, main, baseline) -level E..V. Set the encoding level restriction (auto, 1.0, 1.0b, 1.1, 1.2, . 4.2, 5.0, 5.1) -tier E..V. Set the encoding tier (main or high) -cbr E..V. Use cbr encoding mode (default false) -2pass E..V. Use 2pass encoding mode (default auto) -gpu E..V. Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from 0 to INT_MAX) (default 0) -delay E..V. Delays frame output by the given amount of frames. (from 0 to INT_MAX) (default INT_MAX) -enableaq E..V. set to 1 to enable AQ (default false)
ffmpeg -h encoder=nvenc_hevc
Encoder nvenc_hevc [NVIDIA NVENC hevc encoder]: General capabilities: delay Threading capabilities: none Supported pixel formats: yuv420p nv12 nvenc_hevc AVOptions: -preset E..V. Set the encoding preset (one of slow = hq 2pass, medium = hq, fast = hp, hq, hp, bd, ll, llhq, llhp, default) (default "hq") -profile E..V. Set the encoding profile (high, main, baseline) -level E..V. Set the encoding level restriction (auto, 1.0, 1.0b, 1.1, 1.2, . 4.2, 5.0, 5.1) -tier E..V. Set the encoding tier (main or high) -cbr E..V. Use cbr encoding mode (default false) -2pass E..V. Use 2pass encoding mode (default auto) -gpu E..V. Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from 0 to INT_MAX) (default 0) -delay E..V. Delays frame output by the given amount of frames. (from 0 to INT_MAX) (default INT_MAX) -enableaq E..V. set to 1 to enable AQ (default false)
Важно: s и size в справке не указаны, хотя vf_nvresize.c их имеет! Еще добавлю что s и size это строки, а не WxH, поэтому надо передавать hd1080, hd720, pal, ntsc и прочие строковые обозначения разрешения. Полный их перечень можно получить тут.
ffmpeg -h filter=nvresize
Filter nvresize GPU accelerated video resizer. Inputs: #0: default (video) Outputs: dynamic (depending on the options) nvresize AVOptions: outputs ..FV. set number of outputs (from 1 to 16) (default 1) readback ..FV. read result back to FB (from 0 to 1) (default 0) size ..FV. set video size (default false) s, ..FV. set video size (default false) gpu ..FV. Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from 0 to INT_MAX) (default 0) force_original_aspect_ratio ..FV. decrease or increase w/h if necessary to keep the original AR (from 0 to 2) (default 0)
Целесообразность. Ради чего же все это?
Я не буду здесь приводить подробные бенчмарки (если только сообщество не попросит меня провести определенные тесты), их хватает в интернете, да и скорость кодирования непосредственно картой примерно одинакова и больше зависит от исходного видео, разрешения/битрейта кодируемого и дополнительной обработки (кодирование звука, наложение фильтров).
Вот некоторые цифры для тестовой (дешевой и древней!) системы на Xeon L5420 (4 ядра по 2.5 ГГц)
576p исходник, x264, битрейт выставлен в 3000k:
frame= 7500 fps= 58 q=-1.0 Lsize= 107951kB time=00:05:00.00 bitrate=2947.8kbits/s speed=2.32x
576p исходник, nvenc_h264, битрейт выставлен в 3000k:
frame= 7500 fps=804 q=-0.0 Lsize= 116997kB time=00:05:00.00 bitrate=3194.8kbits/s speed=32.2x
На 1080p исходнике (37 мегабит исходных в 10-15 мегабит) скорость 0.42x и 4.2x — Nvidia опять быстрее примерно в 10 раз.
При кодировании 1080p в HEVC на процессор больно смотреть, там цифры 0.08x и ниже, карта же около 3x выдает.
Для системы на Core i7 разница не такая большая, но все равно карта в 3-4 раза быстрее, чем x265 на HEVC 1080p (15000k) и в 13 раз на HEVC 576p (3000k). И это при том, что сам процессор i7 обычно стоит как GTX 960 и дороже.
Что касается качества. Я перфекционист, но считаю что есть множество применений для аппаратного кодирования, т.к. снижение качества на самом деле заметно слабо (смотрел как на проф.мониторе Dell 24″, так и на телевизоре 60″ — все с близкого расстояния) и только при т.н. pixel хантинге. Зато скорость делает возможным решение задач, которые обычно не способны выполняться в реальном времени на процессоре.
Я сознательно опустил подробности по скорости nvresize, кроме его параметров, т.к. хоть это и очень интересный и быстрый фильтр, но его использование выходит за рамки данной статьи.
Надеюсь, что мой труд не пропадет даром и поможет еще большему количеству людей приобщиться к технологии аппаратного кодирования, обойдя некоторые подводные камни, на решение которых я потратил достаточно много времени. Но это стоило того!
Обновления статьи
- TODO: Применить патч к ffmpeg 3.1, т.к. там появился аппаратный декодер (cuvid), что серьезно помогает при тяжелом кодировании.
- 18.08.2016: Исправил патч перед применением: ctx->outputs[i]->closed на ctx->outputs[i]->status, сам файл решил пока не менять чтобы хеши сходились.
- 25.05.2016: Добавил GTX 950 к списку поддерживаемых, это самый свежий GM206, как и GTX 960 и убрал не соответствующее действительности замечание про Quadro линейку, которая также вышла на базе GM204 и GM206.