Есть довольно хорошие примеры использования 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
в зависимости от битовой глубины.Надеюсь, вы знакомы с форматами пикселей.
Надеюсь, это поможет.