The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]

Кодирование видео при помощи GPU из файла, запись с экрана и стриминг
Драйвер 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), и много чего ещё...
К сожалению, проект закрыт. Сайт проекта - оффлайн, но остался YouTube-канал.

Одним из их проектов было создание патча для GStreamer, оптимизирующего
"узкие места" при кодировании видео, значительно снижая нагрузку на CPU. Патч доступен
на GitHub.

Также по ссылке доступен скрипт rec.sh, являющейся простой графической
оболочкой на KDialog/zenity. При помощи неё можно начать скринкаст, задав
следующие настройки: а). Через что кодировать (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 - вот сравнение
производительности gst и mpv.

Кодировать на GPU от NVIDIA можно при помощи ffmpeg начиная с версии 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"

Также можно просто воспользоваться программным обеспечением  под названием 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 существует патч nvresize, позволяющий кодировать один видеопоток
сразу в несколько файлов: 240p, 360p, 480p, 720p и 1080p. Патч использует CUDA,
тогда как основной функционал nvenc использует только аппаратный энкодер.
Патч применим только к FFmpeg 3.0 и 3.1, а в версии 3.2 он был заменён
на новую технологию CUVID, умеющую гораздо больше возможностей, и также
задействующую CUDA.
 
22.04.2018 , Автор: Zenitur
Ключи: video, ffmpeg, gstreamer / Лицензия: CC-BY
Раздел:    Корень / Пользователю / Обработка изображений и видео

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, J.L., 13:07, 24/04/2018 [ответить] [смотреть все]    [к модератору]
  • +/
    благодарность автору

    команда ffmpeg -f x11grab.... при замене -vcodec nvenc на константа_для_OpenMAX работает для Amdgpu и radeonsi ?

     
  • 1.2, Аноним, 19:14, 24/04/2018 [ответить] [смотреть все]     [к модератору]
  • +1 +/
    Я все грабаю ffmpeg ом с софтварной кодировкой в легкий быстрый lossless кодек ... весь текст скрыт [показать]
     
     
  • 2.7, Аноним, 03:00, 28/04/2018 [^] [ответить] [смотреть все]    [к модератору]  
  • +/
    Можеш дать свой screengrabber.sh ?
     
  • 1.3, Emma Charlotte Duerre Watson, 20:50, 24/04/2018 [ответить] [смотреть все]    [к модератору]  
  • +/
    > 2. Стриминг в Twitch
    > -acodec libmp3lame

    в 2018 есть смысл aac использовать:
    -acodec aac

     
     
  • 2.5, Аноне, 13:30, 27/04/2018 [^] [ответить] [смотреть все]    [к модератору]  
  • +/
    По слуху этот aac звучит даже хуже, чем lame, видимо из-за некачественной реализации. Если только оригинальный libfdk-aac использовать, который не везде собран.
     
     
  • 3.6, Emma Charlotte Duerre Watson, 20:40, 27/04/2018 [^] [ответить] [смотреть все]    [к модератору]  
  • +/
    лет пять назад в trac.ffmpeg.org именно так и писали
    но сейчас написано:
    libfdk_aac > aac
    NOTE: as of 2017 this is no longer necessarily the case. The built in aac encoder is quite good.
     
  • 1.4, Имя, 21:29, 25/04/2018 [ответить] [смотреть все]    [к модератору]  
  • +/
    в последних версиях патч всосали в виде scale_cuda и более качественная версия из библиотеки npp scale_npp

    cuvid это старое название nvdecode, там есть resize\crop\deinterlace но какая часть там cuda, а какая нет сама nvidia уже не помнит

     
  • 1.8, IY, 11:32, 02/05/2018 [ответить] [смотреть все]    [к модератору]  
  • +/
    Портанули бы они свой кодер с куды на опенкл...
     
  • 1.9, pavlinux, 13:55, 17/05/2018 [ответить] [смотреть все]    [к модератору]  
  • +/
    >  Кодировать на GPU от NVIDIA можно при помощи ffmpeg начиная с версии 2.6.
    > узнать остальные можно, выполнив "ffmpeg -h encoder=nvenc"

    ~$ ffmpeg -h encoder=nvenc
    ffmpeg version 2.6.9 Copyright (c) 2000-2016 the FFmpeg developers
    ...
    Codec 'nvenc' is not recognized by FFmpeg.

     
     
  • 2.10, Аноним, 21:24, 21/05/2018 [^] [ответить] [смотреть все]     [к модератору]  
  • +/
    ffmpeg -h encoder nvenc ffmpeg version 2 6 3 Copyright c 2000-2015 the FFmpe... весь текст скрыт [показать]
     
  • 1.11, Аноним, 11:52, 17/06/2018 [ответить] [смотреть все]     [к модератору]  
  • +/
    производительности gst и mpv Автор, ты перепутал с mencoder По ссылке - тест п... весь текст скрыт [показать]
     
     
  • 2.12, Аноним, 11:57, 17/06/2018 [^] [ответить] [смотреть все]     [к модератору]  
  • +/
    Ещё резануло глаза После этого предложения идёт команда для NVIDIA Вероятно, в... весь текст скрыт [показать]
     
  • 1.13, Имя, 20:21, 19/06/2018 [ответить] [смотреть все]    [к модератору]  
  • +/
    А про драйвер radeon ничего не сказали.
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:



      Закладки на сайте
      Проследить за страницей
    Created 1996-2018 by Maxim Chirkov  
    ДобавитьПоддержатьВебмастеруГИД  
    Hosting by Ihor