четверг, 19 января 2017 г.

Сборка OBS Studio и FFmpeg с поддержкой кодека Nvidia NVENC

Приветствую! Если вы любите делать игровые стримы или просто снимать хорошие летсплеи в Windows, то наверняка знаете о таком потрясающем кодеке, как Nvidia NVENC. На базе этого кодека создана целая утилита для высококачественной записи игрового процесса на видеокартах Nvidia - Shadow Play. Плюс этот кодек может применяться и в других программах для записи происходящего на экране (к примеру Bandicam). К сожалению, ни Shadow Play, ни Bandicam не доступны (пока?) в Linux, но возможность использовать кодек NVENC существует. К примеру в не менее известной программе для создания стримов и записи игр OBS Studio, или в Simple Screen Recorder - лучшей утилите для записи происходящего на экране в Linux. Однако для этого необходим мультимедиа пакет FFmpeg, в котором включена возможность использования NVENC. Но так как кодек проприетарный - в большинстве дистрибутивов Linux FFmpeg собран без поддержки NVENC. Поэтому сейчас мы будем это исправлять в своей любимой системе. Внимание: данное руководство актуально только для Ubuntu 16.04 и основанных на ней дистрибутивов. В системах с FFmpeg 3.1.1 и новее, кодек NVENC доступен по умолчанию.

Кодек NVENC используется специальным аппаратным блоком в новых видеокартах Nvidia, в результате ни процессор, ни видеокарта, никак не нагружаются и не садят FPS в играх. Это также позволяет кодировать видео в невероятно высоких битрейтах.

Итак, что нам для этого потребуется:

  • Любой дистрибутив Linux (я буду использовать Debian 8);
  • Компьютер с видеокартой Nvidia архитектуры Kepler, Maxwell или Pascal (600, 700, 900 и 1000 серии видеокарт);
  • Свежие проприетарные драйверы на видеокарту (для Debian можно взять в бэкпортах, для Ubuntu/Mint есть PPA).

Также для сборки с NVENC необходимы заголовчные файлы из официального Nvidia Video SDK. Разумеется - они несвободны, более того, для 7 версии SDK необходима регистрация на сайте Nvidia и принятие лицензионного соглашения. Однако эти файлы нужны только для сборки. Они не нужны на каждом компьютере.

Изначально я хотел писать длинный и нудный гайд по статической сборке FFmpeg и его зависимостей, описания ключей и прочего, пока не наткнулся на один потрясающий скрипт, который позволяет в полностью автоматическом режиме собрать FFmpeg с NVENC, а также - OBS Studio, с его поддержкой. Поэтому мы пойдём более лёгким способом. Такая сборка будет храниться в отдельном каталоге и не принесёт никаких проблем работающей системе, не заменит системный FFmpeg и не сломает никаких зависимостей. Плюс (если вы будете собирать и OBS) - у вас автоматически появится ярлык в меню приложений. Итак, первым делом нам нужно установить Git:

sudo apt install git

Далее клонируем репозиторий со скриптом, переходим в его директорию и выполняем. По умолчанию сборка будет производиться в каталоге ./ffmpeg-nvenc, с помощью ключа -d вы можете указать путь к другому каталогу. Ключ -o позволит собрать OBS Studio:

git clone https://github.com/Sunderland93/ffmpeg-nvenc.git
cd ffmpeg-nvenc
./build.sh -d /home/username/ffmpeg-nvenc-obs -o

Замените "username" на имя своего пользователя. Далее скрипт всё сделает за вас :) Сборка займёт некоторое время, в зависимости от мощности вашего процессора. После сборки в меню приложений появится ярлык OBS. В работоспособности всей операции можно убедиться зайдя в настройки вывода:




Альтернативный вариант для Debian 8: в моём репозитории есть FFmpeg собранный с NVENC. При установке он заменит собой обычный. А так как в репозитории есть и OBS, и Simple Screen Recorder - после установки они буду сразу иметь поддержку кодека Nvenc. Пользователи Arch Linux могут установить FFmpeg собранный с NVENC из AUR. В будущем планируется добавить всё это в репозиторий для Ubuntu.

28 комментариев:

  1. ./obs: error while loading shared libraries: libobs-frontend-api.so.0: cannot open shared object file: No such file or directory

    ОтветитьУдалить
    Ответы
    1. Этот комментарий был удален автором.

      Удалить
  2. и где же этот репозитарий с NVENC в FFMPEG? нашёл какой то реп, sudo add-apt-repository ppa:jonathonf/ffmpeg-3
    но там нифига нет nvenc!

    для компилирования надо ли удалять уже установленный ffmpeg? или не стоит?
    попробую не удалять.

    ОтветитьУдалить
    Ответы
    1. Репозиторий для Debian 8 указан наверху. Но я не даром написал предупреждение, что статья актуальна только для Ubuntu 16.04 и производных, так как в даже в Debian 8 сейчас доступен FFmpeg 3.2 с нативной поддержкой FFmpeg

      Удалить
    2. может нативной поддержкой nvenc?
      Дебиановский глянул репозиторий, почему то файлы не в формате .deb а .tar.xz.
      никогда бы не догадался найти его в Меню.
      искал в тексте статьи и не находил. перечитав раз 20

      Удалить
    3. я думаю что меню с ошибкой. если меню с надписью дебиан ведет на файлы для Opensuse

      Удалить
    4. Репозиторий для Debian хостится на сборочной ферме от проекта OpenSUSE. Я уже тысячу раз об этом писал. Нет там никаких ошибок

      Удалить
  3. ну блин поставил млин NVENC, спасибо автор, теперь у меня исчез obs-studio и запустить его нельзя. user@PC1 ~/ffmpeg3 $ obs-studio
    obs-studio: команда не найдена
    user@PC1 ~/ffmpeg3 $ obs-studio
    obs-studio: команда не найдена
    Как по мне так лучше пускай 15FPS в OBS будет чем его вообще не будет.

    ОтветитьУдалить
    Ответы
    1. Я никакой ответственности не несу. Скрипт не мой. Если есть проблемы - пишите его разработчику. Хотя я перед написанием статьи всё перепроверил, и у меня работало. Завтра проверю ещё раз. Если выяснится что скрипт поломан - заменю на свой вариант

      Удалить
    2. вообще странно что все дистры не взяли этот NVENC себе сразуже . наверное они просто обожают когда про их дистрибутив пишут видео с тормозами и лагами.
      ну что лучше тормозящего видео сможет отрекламировать дистр )

      Удалить
    3. При чём здесь дистры? NVENC это проприетарный кодек от Nvidia. Только недавно они перелицензировали API под свободной лицензией, потому FFmpeg принял его в свой состав. Раньше нужно было ставить заголовки из Nvidia Video SDK

      Удалить
    4. ну вот у меня стоит фирменный FFmpeg 3.2.4 а толку NVENC как не было так и нет
      Сейчас вот ставлю Cuda 8.0 нашёл что его можно тут стянуть
      https://developer.nvidia.com/cuda-downloads
      вдруг если вашим скриптом не ставится, то может захочет так поставитcz NVENC
      к сожалению о какой либо экономии места после 2гб файла говорить вообще нельзя.

      Удалить
    5. Нафига так ломать свою систему? Из репов поставьте nvidia-cuda-toolkit и всё. Не знаю что вы наворотили у себя, я на двух разных дистрибутивах проверил - всё работает. Компилируется и запускается. Проблема у вас.

      Удалить
    6. мне сказали на другом форуме что для его работы NVENC нужна Cuda 8 и сказали где её взять.
      я бы никогда в жизни не догадался что nvidia-cuda-toolkit нужен.
      эх ещё -450мб на файлы Cuda 7.5.
      поставил НИФИГА ! нет никакого nvenc в OBS

      на другом форуме мне вот посоветовали поставить nvidia-uvm
      но uvm есть только для 340 драйвера в виде пакета
      для 378.13 uvm видимо идёт в комлпекте.
      /dev/nvidia0 /dev/nvidiactl /dev/nvidia-uvm
      Ставил только драйвер из ppa.



      наверное уже слишком много попыток поставить этот NVENC
      уже никаких сил нет его ставить замаялся.
      буду внешней камерой снимать она достаточно качественная.

      а может через годика 2 наконец во все PPA его нормально завезут
      ну и может новую OBS 18 тоже наконец в PPA кто нибудь выложит
      с меня хватит я пас. надоело.
      лучше бы я 3 дня сериалы посмотрел толку бы больше было.
      или переводом статей занялся которые я постоянно откладываю.
      и перевёл лишь наполовину. работа вся стоит.

      когда нибудь это же сделают чтобы работало из коробки.
      надо просто подождать несколько лет.




      Удалить
    7. Не нужен NVENC'у никакой CUDA. Это вам он за каким-то хреном понадобился, я лишь подсказал как его правильно поставить. Последний раз повторяю - проблема только у вас. У меня всё работает согласно статье, в Debian 9 сразу из коробки есть NVENC. OBS его поддерживает с 15 версии, которая как раз штатно в Debian 9. То есть она старая, и даже там всё работает. На нескольких разных конфигурация. Карта Nvidia GeForce GTX 760 и 375 драйвер. Так что не надо тут ныть как всё плохо. Всё отлично. И работает прекрасно. В PPA никто не будет этого делать, потому что если поставить свежий FFmpeg в систему - это сломает кучу приложений. Именно поэтому я не сделал этого. В Ubuntu 16.04 старый FFmpeg, версии 2.8. Его даже патчить нет смысла. А жаловаться будете тогда, когда начнёте платить кому-то за результат. И этот результат не оправдает надежд. А за бесплатно для вас никто ничего делать не будет.

      Удалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. eg3/ffmpeg-nvenc $ obs
    bash: /usr/bin/obs: Нет такого файла или каталога
    user@PC1 ~/ffmpeg3/ffmpeg-nvenc $ obs
    bash: /usr/bin/obs: Нет такого файла или каталога
    user@PC1 ~/ffmpeg3/ffmpeg-nvenc $ obs
    bash: /usr/bin/obs: Нет такого файла или каталога


    блин.
    опять заново компилировал зря.

    лучше бы PPA сделали вместо этого бесполезного руководства!!

    ОтветитьУдалить
    Ответы
    1. Лучше бы на кабы. Вам никто ничего не должен. Хотите PPA - вперёд. Делайте. Руководств в сети полно. Есть учебник от Debian по сборке пакетов.

      Удалить
    2. Да, действительно, проблема есть. И связана она с OBS. Я доработаю скрипт и обновлю статью. Репозиторий я не могу сделать по одной причине - чтобы не ломать работу системы. Если удастся найти способ сделать всё аккуратно - сделаю.

      Удалить
    3. Скрипт исправлен и проверен. Теперь всё работает.

      Удалить
    4. спасибо !! будем тестировать!

      не с меня хватит как я как то раз опакечивал Wine и накладывал на него патч)))
      чтобы один пакет сделат нормально пришлось отформатировать хард т.к. при формировании пакета что то ломалось на ноуте и после компиляции если его перезагрузить он больше уже никогда не загружался. с тех пор желание что то опакетить понизилось. ну может годиков на 5. пока это не исправят. может уже исправили

      Удалить
    5. peg-nvenc-obs
      ./build.sh: строка 263: ошибка синтаксиса: неожиданный конец файла
      PC1 ffmpeg-nvenc # sudo ./build.sh -d /home/user/ffmpeg-nvenc-obs -o
      Building FFmpeg in /home/user/ffmpeg-nvenc-obs
      ./build.sh: строка 263: ошибка синтаксиса: неожиданный конец файла
      PC1 ffmpeg-nvenc #


      скрипт не редактировал, т.к. забыл куда все файлы сохранил


      где то поспешили может быть?

      Удалить
    6. Нет смысла добавлять проверку на наличие архивов с исходниками, так как после сборки каталог будет очищаться. Их в любому случае нужно будет выкачивать при новой сборке. Или вам понравится если будет тонна сборочного мусора в каталоге с программой?. Скрипт полностью рабочий, проверено на двух системах. Не надо его запускать через sudo, он сам запросит нужные права. То что вы его запускаете от sudo - нарушает правильную работу всего скрипта

      Удалить
    7. запускал без судо - неработает.
      я кажется уже даже постил лог , тупо просто ничего не происходит только 1 надпись пишет но ничего не делается
      ничего не качается ничего не компилируется
      вообще ничего не происходит

      предыдущий скрипт хотя бы пытался работать

      Удалить
    8. Я в инструкции никакого sudo не указывал. Поэтому понятия не имею что и где у вас сломалось. У меня всё работает сейчас, ни одну вашу проблему подтвердить не могу.

      Удалить
  6. NVENC это конечно круто, но как на счёт iQSV?

    ОтветитьУдалить
    Ответы
    1. Патч есть, проходит ревью. Возможно в следующем выпуске OBS добавят поддержку

      Удалить
  7. Зачем выкладывать заведомо не рабочее?
    vova@lm-pc ~/ffmpeg-nvenc $ ./build.sh -d /home/vova/ffmpeg-nvenc-obs -o
    Building FFmpeg in /home/vova/ffmpeg-nvenc-obs
    ./build.sh: строка 263: ошибка синтаксиса: неожиданный конец файла

    ОтветитьУдалить