Как выполнить код ffmpeg на графическом процессоре без использования командной строки? - PullRequest
0 голосов
/ 18 октября 2018

Мы написали короткий код в коде C для чтения видеофайла, используя общие библиотеки как libavcodec, libavformat и т. Д.

Код работает без сбоев, но только с использованием ресурсов ЦП.Нам нужно запустить код на графическом процессоре (Nvidia GeForce 940MX и 1080Ti).Есть ли способ заставить код выполняться на графическом процессоре?

Хотя с использованием командной строки (например, ffmpeg -hwaccel cuvid -i vid.mp4 out.avi) все в порядке, мы не можем заставить его работать на графическом процессоре изисходный код.

Мы работаем с Ubuntu 18.04, и ffmpeg правильно скомпилирован с CUDA 9.2

1 Ответ

0 голосов
/ 23 октября 2018

Есть довольно хорошие примеры использования libav (ffmpeg) для кодирования и декодирования видео на https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples.

Для примера вам нужно demuxing_decoding.c и изменить строки 166, что:

/* find decoder for the stream */
dec = avcodec_find_decoder(st->codecpar->codec_id);

с

/* find decoder for the stream */
if (st->codecpar->codec_id == AV_CODEC_ID_H264)
{
    dec = avcodec_find_decoder_by_name("h264_cuvid");
}
else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC)
{
    dec = avcodec_find_decoder_by_name("hevc_cuvid");
}
else
{
    dec = avcodec_find_decoder(st->codecpar->codec_id);
}

добавить / изменить строки для других форматов.И убедитесь, что ваш FFmpeg скомпилирован с --enable-cuda --enable-cuvid

. В моих тестах я получил ошибку из строки 85: потому что nvdec (hevc_cuvid) использует внутренний формат p010 для 10 бит (входное значение - yuv420p10).Это означает, что декодированный кадр будет иметь формат NV12 пикселей или P010 в зависимости от битовой глубины.Надеюсь, вы знакомы с форматами пикселей.

Надеюсь, это поможет.

...