Драйвер Intel использует API под названием VA-API, драйвер Amdgpu - OpenMAX, NVIDIA - Nvenc. А драйверы fglrx и nouveau не имеют поддержки аппаратного энкодера.1. Кодирование при помощи GPU (из файла или запись с экрана)
Несколько лет назад существовал проект Gears on Gallium, который проводил бенчмарки драйверов и игр (преимущественно опенсорсных, но бывали и исключения - например эти ребята были первыми, кто опубликовал результаты тестов Doom 2016 под Wine Staging + AMDGPU-PRO + Vulkan), формировал дистрибутив Linux в форме Docker-контейнера с последним графическим стеком (из GIT), и много чего ещё... К сожалению, [[https://www.linux.org.ru/forum/talks/13220491 проект закрыт]]. Сайт проекта - оффлайн, но остался [[https://www.youtube.com/channel/UCh1UanySk_Ht0WRfo4O9STw/videos YouTube-канал]].
[[https://www.linux.org.ru/forum/development/10496233 Одним из их проектов]] было создание патча для GStreamer, оптимизирующего "узкие места" при кодировании видео, значительно снижая нагрузку на CPU. Патч доступен [[https://github.com/pontostroy/gstreamer-screenrecording на GitHub]].
Также по ссылке доступен скрипт rec.sh, являющейся простой графической оболочкой на KDialog/zenity. При помощи неё можно начать [[https://ru.wikipedia.org/wiki/%D0%A1%D0%... скринкаст]], задав следующие настройки: а). Через что кодировать (Software, VA-API (Intel), OpenMAX (AMD open source)) б). Полный экран или окно? в). Куда сохранять? В итоге формируется команда наподобие такой:
gst-launch-1.0 -e ximagesrc use-damage=0 ! queue ! video/x-raw,format=BGRx ! videoconvert ! video/x-raw,format=I420,framerate=30/1 ! queue ! vaapiencode_h264 ! h264parse ! queue ! matroskamux ! progressreport ! filesink location=/home/username/Videos/screencast_current_date.mkv
Хотя написано "1.0", на самом деле это приложение называется так же и в Gstreamer 1.2, и в 1.4, и т.д. Чтобы команда работала, в вашей системе должен быть установлен пакет gstreamer-plugins-vaapi.
Также на AMD и Intel можно кодировать при помощи mpv - вот [[https://www.linux.org.ru/forum/talks/11143338 сравнение]] производительности gst и mpv.
Кодировать на GPU от NVIDIA можно при помощи ffmpeg [[https://www.opennet.dev/opennews/art.shtml?num=41805 начиная]] с версии 2.6. Вот пример команды:
ffmpeg -f x11grab -r 30 -s 1920x1080 -i :0.0 -f alsa -i pulse -ac 2 -ar 48000 -acodec libfdk-aac -vcodec nvenc -preset hq -tune film -threads 0 output.mkv
Я использую параметры "-preset hq -tune film", узнать остальные можно, выполнив "ffmpeg -h encoder=nvenc"
2. Стриминг в Twitch
rec.sh не знает как это делать, поэтому вручную:
gst-launch-1.0 ximagesrc use-damage=0 ! video/x-raw,format=BGRx ! videoconvert ! video/x-raw,format=I420,framerate=30/1 ! queue leaky=downstream ! x264enc speed-preset=faster qp-min=30 tune=zerolatency ! queue ! flvmux name=muxer pulsesrc device=alsa_output.pci-0000_00_1b.0.analog-stereo.monitor ! queue ! voaacenc bitrate=128000 ! aacparse ! queue ! muxer. muxer. ! rtmpsink location="rtmp://live.justin.tv/app/live_ВАШ_ID"
Если не работает кодирование аудио, убедитесь что установлен
ffmpeg -f x11grab -s "1920x1080" -r "30" -i :0.0 -f alsa -i pulse -f flv -ac 2 -ar 44100 -vcodec nvenc -s 1280x720 -preset hq -tune film -acodec libmp3lame -threads 0 -strict normal "rtmp://live.justin.tv/app/live_ВАШ_ID"
Также можно просто воспользоваться программным обеспечением под названием [[https://obsproject.com/ru OBS]]
3. Как задействовать аппаратное кодирование в OpenShot, PiTiVi и других редакторах видео
Первый использует ffmpeg, второй - Gstreamer. Важно чтобы ваш системный ffmpeg был скомпилирован с флагами "--enable-nonfree --enable-nvenc". И тогда в списке доступных энкодеров появится nvenc. Если и в этом случае он не появляется - попробуйте пересобрать libmlt - посредника между OpenShot и ffmpeg.
4. Возможные проблемы
У меня было так, что выбран не тот VA-API backend, и поэтому при запуске команды из консоли была ошибка "не удаётся кодировать при помощи fglrx_drv_video.so". Возможно что причина в том, что раньше у меня была видеокарточка от AMD. Решается так: export LIBVA_DRIVER_NAME=i965. Можно также добавить это в /etc/environment.
А вообще, если что-то работает не так то для отладки полезен параметр "export GST_DEBUG=4".
Если не работает стриминг при помощи GStreamer, убедитесь что установлен плагин gstreamer-plugins-bad. В openSUSE мне помогла установка пакета gstreamer-plugins-bad-orig-addon.
Для ffmpeg существует [[http://developer.download.nvidia.com/compute/redist/ffmpeg/1... патч nvresize]], позволяющий кодировать один видеопоток сразу в несколько файлов: 240p, 360p, 480p, 720p и 1080p. Патч использует CUDA, тогда как основной функционал nvenc использует только аппаратный энкодер.
[[https://build.opensuse.org/package/view_file/home:linux4huma... Патч]] применим только к FFmpeg 3.0 и 3.1, а в версии 3.2 он был [[https://developer.nvidia.com/ffmpeg заменён]] на новую технологию CUVID, умеющую гораздо больше возможностей, и также задействующую CUDA.
URL:
Обсуждается: http://www.opennet.dev/tips/info/3063.shtml