Добавляем скорости VMAF с помощью CUDA

Да, речь пойдёт о том, как скомпилировать VMAF с поддержкой CUDA и запускать фильтр из FFMPEG. Вся компиляция проверена под Ubuntu 25.15, без использования Docker и с минимумом готовых библиотек.

Устанавливаем средства компиляции и необходимые библиотеки:

sudo apt install autoconf automake build-essential yasm cmake git-core unzip libtool wget meson ninja-build pkg-config libunistring-dev libnuma-dev libc6-dev libsdl2-dev zlib1g-dev

Ставим CUDA 13.1:

wget https://developer.download.nvidia.com/compute/cuda/13.1.1/local_installers/cuda_13.1.1_590.48.01_linux.run

chmod +x cuda_13.1.1_590.48.01_linux.run

sudo ./cuda_13.1.1_590.48.01_linux.run --toolkit

Устанавливаем заголовки Nvidia Video SDK:

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git

cd nv-codec-headers

sudo make install

Скачиваем исходники и конфигурируем VMAF:

wget https://github.com/Netflix/vmaf/archive/v2.3.1.tar.gz

tar xvf v2.3.1.tar.gz

mkdir -p vmaf-2.3.1/libvmaf/build

cd vmaf-2.3.1/libvmaf/build

meson setup ../libvmaf/ -Denable_tests=false -Denable_docs=false --buildtype=release --default-library=static

ninja -vC .

sudo ninja install

Скачиваем исходники FFMPEG:

git clone https://git.ffmpeg.org/ffmpeg.git

cd ffmpeg

# 894da5ca7d742e4429ffb2af534fcda0103ef593 - v8.0.1
git checkout 894da5ca7d742e4429ffb2af534fcda0103ef593

Конфигурируем FFMPEG и компилируем:

cd ffmpeg

./configure \
--extra-libs='-lpthread -lm' \
--ld=g++ \
--enable-gpl \
--enable-gnutls \
--enable-nvenc \
--enable-cuvid \
--enable-nvdec \
--enable-cuda-nvcc \
--enable-cuda \
--enable-zlib \
--enable-libvmaf \
--enable-nonfree \
--enable-ffplay \
--enable-filter=libvmaf_cuda \
--enable-filter=scale_cuda \
--disable-filter=scale_npp \
--pkg-config-flags=--static \
--enable-static \
--disable-shared \
--extra-cflags=-fPIC \
--extra-cflags=-I/usr/local/cuda/include/ \
--extra-ldflags=-L/usr/local/cuda/lib64/ \
--extra-ldflags=-L/usr/local/lib

make -j

sudo make install

Запуск расчёта VMAF с масштабированием оригинала до 1920×1080:

ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -r 30 -i reference.mp4 -hwaccel cuda -hwaccel_output_format cuda -r 30 -i transcoded.mp4 -filter_complex "[0:v]scale_cuda=w=1920:h=1080:format=yuv420p[ref],[1:v]scale_npp=format=yuv420p[enc];[ref][enc]libvmaf_cuda=log_path=vmaf.log" -f null /dev/null

Или запуск расчёта сразу с моделью VMAF NEG и использованием несжатого оригинального видео

ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -r 30 -i reference.y4m -hwaccel cuda -hwaccel_output_format cuda -r 30 -i transcoded.mp4 -filter_complex "[0:v]split=2[ref1][ref2];[1:v]split=2[enc1][enc2];[ref1]hwupload_cuda[ref_hw1];[ref2]hwupload_cuda[ref_hw2];[ref_hw1]scale_cuda=w=1920:h=1080:format=yuv420p[ref_sc1];[ref_hw2]scale_cuda=w=1920:h=1080:format=yuv420p[ref_sc2];[ref_sc1][enc1]libvmaf_cuda=log_path=vmaf.log[out1];[ref_sc2][enc2]libvmaf_cuda=log_path=vmafneg.log:model=path=<path to vmaf library>/model/vmaf_v0.6.1neg.json[out2]" -map "[out1]" -map "[out2]" -f null /dev/null
Фото аватара
dmitry
http://www.vmetrix.tech

Leave a Reply