Что такое ffmpeg?
А то вы не знаете.
Что такое nvenc?
Аппаратный кодер в h264 (и не только https://developer.nvidia.com/ffmpeg#FFmpeg_GPU_HW-Acceleration_Support_Table).
На каких картах работает?
Kepler (NVIDIA GeForce 6xx за исключением тех, которые базируются на Fermi) и новее.
Как включить?
Установите заголовочные файлы NVENC, взяв их отсюда: https://developer.nvidia.com/nvidia-video-codec-sdk#Download Файлы имеют имена *.h, например nvEncodeAPI.h. Класть в /usr/include (Upd: оказывается, можно в пространство пользователя - читаем конец статьи).
Gentoo
Есть USE-флаг «nvenc», «подтягивающий» media-video/nvidia_video_sdk Пруф
Arch
FFmpeg из дефолтных реп собран с nvenc. Пруф
Ubuntu
Имейте в виду что ffmpeg вернули лишь в последних релизах Ubuntu. Включаем репозиторий Source уот так уот. Обновляем базу пакетов apt-get. Выполняем:
sudo apt-get build-dep ffmpeg // зависимости для сборки
mkdir ~/build-ffmpeg
cd ~/build-ffmpeg
apt-get source ffmpeg // скачиваем исходный код ffmpeg. Ключ -b его сразу соберёт
Собирать командой fakeroot ./debian/rules binary
, но нам сначала надо открыть файл rules, найти параметры для сборки, и добавить --enable-nonfree
и --enable-nvenc
. Первый, скорее всего, уже добавлен (для AAC).
Из исходников
Берём исходник ffmpeg. Распаковываем его куда-нибудь, например в ~/build-ffmpeg. Выполняем «ffmpeg», чтобы посмотреть, с какими параметрами configure он собран. Заходим в директорию с исходниками и пишем "./configure", затем копируем параметры. Только в них надо кое-что поменять:
- Убираем всю эту кашу директорий: «это туда, это сюда». Тупо делаем
--prefix=/home/username/build-ffmpeg/3.2/
- Добавляем --enable-nvenc. Если по какой-то причине --enable-nonfree нет, добавляем и его тоже
Потом make и make install (без sudo). Всё. Использовать так:
LD_LIBRARY_PATH=/home/username/build-ffmpeg/3.2/lib/ /home/username/build-ffmpeg/3.2/bin/ffmpeg
Пользуемся
ffmpeg -i непожатое_видео.mkv -acodec libfaac -ac 2 -ab 128k -vcodec nvenc -preset hq -tune film пожатое_видео.mkv
Начиная с FFmpeg 3.2, вместо «nvenc» - «h264_nvenc», вероятно будет h265. И вместо libfaac теперь что-то другое.
Бонус
Не удивляйтесь моему комменту под записью с накладыванием стороннего патча на ffmpeg. Оказалось что патч уже в апстриме, я не знал. Выше я рассказывал только про NVENC. А ещё есть libnpp и CUVID, речь о которых пойдёт здесь.
libnpp (бывший nvresize) расширяет возможности NVENC, который разделён на часть без CUDA (nvenc) и с CUDA (nvenc+libnpp). Я считаю разумным отделение части функционала, требующего CUDA! У меня без libnpp не заработало только обрезание видео с 1600x900 до 1024x600 (хотел взять запись полного экрана и выхватить из него только окно с помощью -filter:v "crop=1024:600:263:75"
). Я уверен что есть и другие применения libnpp, о которых я не знаю, и также уверен что большинству пользователей часть с CUDA не нужна: ведь что нужно большинству? Записывать видео с экрана (с минимальной нагрузкой на CPU), сжимать несжатые видео, ну и некоторым стримить в Твич.
CUVID теперь называется nvDecode. Насколько я понял, включение CUVID выступает в роли катализатора для декодирования и кодирования видео, перенося ещё больше действий с CPU на GPU. Как работает, Как пользоваться (спасибо hizel за ссылки).
Кстати, если вам нужны libnpp и CUVID, устанавливать CUDA Toolkit не нужно: тех файлов CUDA, которые есть в самом драйвере NVIDIA, будет достаточно.
Включается так:
--enable-nonfree --enable-nvenc --enable-cuda --enable-cuvid --enable-libnpp
Брал здесь: https://developer.nvidia.com/ffmpeg. Там ещё есть --extra-cflags=-Ilocal/include --extra-cflags=-I../nv_sdk --extra-ldflags=-L../nv_sdk
, а значит я зря копировал всё в /usr/include - можно было в /home/username/build-ffmpeg/nv_sdk
Несколько других полезных ссылок: Доступные разрешения экранов, Моя подборка полезных команд для ffmpeg.