Comments 57
Вроде, моя карточка уже как два поколения должна поддерживать NVENC, но не удалось пока запустить ни один найденый мною пример на аппартаное кодирование видео.
Я такую ошибку видел когда на голую систему поставил свою сборку ffmpeg, а весь набор с драйверами (7.5.18) забыл установить.
Также стоит посмотреть точно ли ваша карта поддерживает NVENC? Фактически, там только Kepler и Maxwell и все.
Поколение Maxwell, вроде nvenc поддерживается на всех kepler и maxwell.
Попробуйте добавить в строку ключ: -pix_fmt yuv420p
По умолчанию ffmpeg проверяет yuv444p.
Для информации используйте
ffmpeg -h encoder=nvenc_h264
или
ffmpeg -h encoder=nvenc_hevc
(https://trac.ffmpeg.org/wiki/HWAccelIntro)
built with gcc 6.1.1 (GCC) 20160501
configuration: --prefix=/usr --extra-cflags=-I/usr/include/nvidia-sdk --extra-cxxflags='-std=gnu++98' --extra-ldflags='-Wl,-rpath -Wl,/opt/intel/mediasdk/lib64' --enable-rpath --enable-gpl --enable-version3 --enable-nonfree --disable-static --enable-shared --enable-avresample --enable-avisynth --enable-chromaprint --enable-decoder=atrac3 --enable-decoder=atrac3p --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gpl --enable-gray --enable-iconv --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcelt --enable-libdc1394 --enable-libdcadec --enable-libfaac --enable-libfdk-aac --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libiec61883 --enable-libilbc --enable-libkvazaar --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libnut --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopencv --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librubberband --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsmbclient --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtesseract --enable-libtheora --enable-libtwolame --enable-libutvideo --enable-libv4l2 --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxcb --enable-libxcb-shm --enable-libxcb-xfixes --enable-libxcb-shape --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-netcdf --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-openssl --enable-x11grab
libavutil 55. 17.103 / 55. 17.103
libavcodec 57. 24.102 / 57. 24.102
libavformat 57. 25.100 / 57. 25.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 31.100 / 6. 31.100
libavresample 3. 0. 0 / 3. 0. 0
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Encoder nvenc_h264 [NVIDIA NVENC h264 encoder]:
General capabilities: delay
Threading capabilities: none
Supported pixel formats: yuv420p nv12 yuv444p
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 «medium»)
-profile E..V… Set the encoding profile (high, main, baseline or high444p) (default «main»)
-level E..V… Set the encoding level restriction (auto, 1.0, 1.0b, 1.1, 1.2, ..., 4.2, 5.0, 5.1) (default «auto»)
-tier E..V… Set the encoding tier (main or high) (default «main»)
-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)
built with gcc 6.1.1 (GCC) 20160501
configuration: --prefix=/usr --extra-cflags=-I/usr/include/nvidia-sdk --extra-cxxflags='-std=gnu++98' --extra-ldflags='-Wl,-rpath -Wl,/opt/intel/mediasdk/lib64' --enable-rpath --enable-gpl --enable-version3 --enable-nonfree --disable-static --enable-shared --enable-avresample --enable-avisynth --enable-chromaprint --enable-decoder=atrac3 --enable-decoder=atrac3p --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gpl --enable-gray --enable-iconv --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcelt --enable-libdc1394 --enable-libdcadec --enable-libfaac --enable-libfdk-aac --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libiec61883 --enable-libilbc --enable-libkvazaar --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libnut --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopencv --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librubberband --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsmbclient --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtesseract --enable-libtheora --enable-libtwolame --enable-libutvideo --enable-libv4l2 --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxcb --enable-libxcb-shm --enable-libxcb-xfixes --enable-libxcb-shape --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-netcdf --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-openssl --enable-x11grab
libavutil 55. 17.103 / 55. 17.103
libavcodec 57. 24.102 / 57. 24.102
libavformat 57. 25.100 / 57. 25.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 31.100 / 6. 31.100
libavresample 3. 0. 0 / 3. 0. 0
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
libpostproc 54. 0.100 / 54. 0.100
Encoder nvenc_hevc [NVIDIA NVENC hevc encoder]:
General capabilities: delay
Threading capabilities: none
Supported pixel formats: yuv420p nv12 yuv444p
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 «medium»)
-profile E..V… Set the encoding profile (high, main, baseline or high444p) (default «main»)
-level E..V… Set the encoding level restriction (auto, 1.0, 1.0b, 1.1, 1.2, ..., 4.2, 5.0, 5.1) (default «auto»)
-tier E..V… Set the encoding tier (main or high) (default «main»)
-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)
--disable-static --enable-shared
Вот эти два ключа нам мешали запустить кодирование под CentOS, правда ошибка была другая. Попробуйте собрать статически ffmpeg, авось?
Вот тут выла статья про обход блокировки: https://habrahabr.ru/post/262563/
А вот тут есть гайд по настройке от самой NVIDIA: http://developer.download.nvidia.com/compute/redist/ffmpeg/1511-patch/FFMPEG-with-NVIDIA-Acceleration-on-Ubuntu_UG_v01.pdf
К сожалению, все еще на «тяжелой» сцене с gpu кодированием (при сопоставимом с cpu вариантом выходном битрейте) видео ряд превращается в развалившуюся картинку размытых блоков.
На 2:57 (сцена с деревьями) самая показательная.
Пробовали на quadro, grid, tesla… Скорости хорошие (раза в 2-4 быстре cpu), но качество не понравилось.
alexkuzko, вот вам Red Velvet — 행복(Happiness).mov в Apple ProRes yuv422p10le. Давайте вместе попробуем его скодировать «для просмотра в интернете», чтобы выходной размер скодированного видеопотока получился около 100±10 мегабайт, и визуально сравним, у кого что. Готовое видео должно быть в HEVC YUV 4:2:0. Никаких фильтров, кроме преобразования цветового пространства. Ограничений на опции энкодера нет, выставляйте максимально возможное качество.
сам файл и опции кодирования
Насколько хорошо получилось уже сказать не могу, глаза слипаются. С утра погляжу подробнее. Если по-быстрому, то очень близки с вашим.
ffmpeg -help encoder=nvenc_hevc
) Еще, почему-то, предиктор просто отвратительно работает. -g 250
еще добавьте.Пока что ваш результат на комплексных сценах (вторая сцена с танцами на фоне пальм) хуже ютубовского H.264, который весит примерно столько же (105 мегабайт).
hq следующий по качеству
Поменял параметры немного, взгляните еще раз своим орлиным взором и раскритикуйте, не забывая что процессором это кодировалось бы медленнее в 25 раз на Core i7 3.0 (сейчас со скоростью ~0.1x и кодируется там… через час посмотрю что получилось).
На 00:01:34.225, когда по ключевым переключаешь, второй вариант (002/003) намного лучше. Лица уже не так плывут квадратами.
Также я сделал 002 (hq) и 003 (slow) с одинаковыми параметрами (те же ссылки, только вместо mkv — txt) кроме профиля — если вы сможете понять какой из них лучше, будет интересно. Они и про времени близки (slow даже чуть быстрее оказался, чем hq) и по качеству.
Sony Vegas Pro
начиная с 11 версии оно умеет видеокарту использовать.
Option->Preferences->GPU acceleretion of video processing->[OFF|ваша_видеокарта] если нет карты, меняйте драйвера на нее, не все драйвера поддерживают кодирование видео.
скорость перекодировки заметно увеличивается.
Приспасибочки за статью и видюшка и железяка под рукой ^_^
Интересно было бы сравнить выигрыш в скорости.
Они недавно вырезали из SDK поддержку некоторых (да, дешевых и массовых) процессоров и фактически сводят все к тому, что работать технология будет только на серверных чипсетах и процессорах. Почитать можно здесь же на хабре, последняя статья от интела и ссылка на их форум.
А что касается видеокарты — ее можно поставить в любой компьютер. Если проброс PCI устройств работает в гипервизоре, то и на виртуалке можно поднимать когда нужно (сам пока не пробовал т.к. в целом это стезя Quadro — посмотрите на амазоне виртуалки с GPU — и в случае с одиночной картой и специально выделенным компьютером проще напрямую на сервере работать).
И соответсвующие 9-й линейке Quadro тоже есть — M2000 (GM206), M4000 и M5000 (GM204) — почему вы считаете что в них какой-то другой NVENC?
Но одно дело когда ты вообще ничего не можешь, и совсем другое, когда ограничения касаются только проф.использования. Просто для перекодирования хватает и одного потока, второй дает небольшой бонус. Большое количество потоков нужно в первую очередь для ретрансляции.
По второму вопросу, ограничения очень четкие, без привязки к цене:
https://developer.nvidia.com/nvidia-video-codec-sdk — вот тут написано что ограничение на 2 потока касается только Desktop and Mobile Computers, т.е. линейке GeForce.
Вообще, текущий список для Quadro:
Quadro K2000, K2200, K4000, K4200, K5000, K5200, K6000, M4000, M5000, M6000, and newer
Quadro K2000M, M2000M, K5000M, and newer
Ваша K620 просто старая судя по всему. У нее ведь даже память DDR3, а не GDDR5 (интересно отчего codename у них одинаковый с K2200 — GM107? Но это уже на совести Nvidia).
В любом случае NVENC SIP там есть, карточка вроде бы как Quadro, но лицензия урэзанная. Этот список не спасает, поскольку это список тех карточек, которые вообще в принципе nvenc умеют (там ниже и GeForce упомянуты, с явным ограничением в 2 сессии). То есть если K620 умеет, то, значит, она в этом списке есть (видимо, newer).
HEVC всё-таки это технология будущего, пока что подавляющее большинство железа ее не тянет (даже на декодировании).
А вот использовать nvenc_h264 — это действительно круто, но с некоторыми ограничениями. Обработка в один поток упирается в CPU на этапе декодирования, при этом nvidia-smi показывает utilization около 10-20% на K1200. Так что добиваться поразительных результатов надо с использованием nvresize и кодированием сразу в несколько качеств. Первый значительно снижает нагрузку на CPU при масштабировании картинки, да еще и распределяет кадры по потокам nvenc, не возвращая их обратно на хост-машину. А насчет нескольких качеств выходит так: исходник h264 1080p преобразуется в набор 240p + 360p + 576p + 720p со скоростью 500-600fps, при этом на GPU utilization encoding и cuda доходит до 100%.
Правда эффективную параллельную обработку запилить не удается, мешает… ffmpeg! Оказывается, filter_complex при его задействовании упирается при переброске фреймов в одно ядро, причем просто на кодировании звука в aac с разными битрейтами. GPU при этом застревает где-то на 200 fps, CPU тоже свободен (кроме одного ядра). Остается вариант с одинаковым аудиопотоком во всех результатах, плюс ухищрения с "-f tee", чтобы раскидать один и тот же аудиопоток по 4 файлам.
h264_qsv в этих случаях делает неудовлетворительное качество, картинка периодически рассыпается на квадраты.
в отличие от оригинальной статьи, где почему-то упустили этот момент, я применил переработанный патч Nvidia Acceleration к FFmpeg 3.0.2, получив помимо энкодера nvenc еще и быстрый фильтр ресайза — nvresize
Первая часть этой статьи была написала в июле 2015го, а внедрение на продакшн состоялось в марте. PDF про описываемый патч датирован ноябрём 2015го года, судя по титульному листу.
Кстати, может вы нашли более человеческий способ убрать ограничение на 2 потока? А свой пробовали с последним SDK?
Других способов лечения лимита не искал даже, так как понятно где он и лучше разбираться с ним адресно. Возможно стоит поискать, где откуда библиотека узнаёт об уже запущенных потоках, но и это не гарантирует простого решения.
С тех пор я стал заниматься уже совсем другим в другом месте и сейчас такого оборудования нет под рукой.
Почему в опросе нет варианта: нет, но собираюсь?
Это вполне очевидно. Или просто циферкой ошиблись?
Очень интересно.
Поделитесь знанием.
Понадобилось внести небольшие правки (разбирался с особенностями SAR/DAR при кодировании в 720 на 576, Nvidia решила за пользователей что 704 это правильнее...) и обнаружил что патч не применяется т.к. надо менять ctx->outputs[i]->closed на ctx->outputs[i]->status
Насчет 3.1, там многое поменялось, поэтому надо переписать измененные процедуры, некоторые вещи вообще из патча можно будет убрать. Идеальным вариантом был бы новый патч от Nvidia, который мы бы переработали. Но ждать его можно год и больше, поэтому я посмотрю что с этим можно сделать в течение месяца.
Быстрое кодирование видео в Linux c Nvidia NVENC с SDK 7.5 и ffmpeg 3.0.2 на Nvidia GTX 960/970/980