Как декодировать AVFrame с пиксельным форматом AV_PIX_FMT_CUDA в программном обеспечении? - PullRequest
0 голосов
/ 19 января 2020

Недавно я следовал этому примеру (https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/vaapi_encode.c) для кодирования AVFrame с использованием NVEN C (среди прочего, путем замены AV_PIX_FMT_VAAPI на AV_PIX_FMT_CUDA и h264_vaapi на h264_nvence). Сейчас я пытаюсь декодировать кодированный пакет и преобразовывать его в AV_PIX_FMT_YUV420P следующим образом:

AVFrame *frame;
AVCodecContext *context;
AVCodec *codec;

avcodec_register_all();
codec = avcodec_find_decoder(AV_CODEC_ID_H264);

// allocate and set ffmpeg context
context = avcodec_alloc_context3(decoder->codec);

// open capture decoder
avcodec_open2(context, codec, NULL);

// alloc frame format
frame = (AVFrame *) av_frame_alloc();
frame->format = AV_PIX_FMT_CUDA;

// Receive AVPacket here ...

int success;
avcodec_decode_video2(context, frame, &success, &packet);

// Convert to YUV420P

struct SwsContext *sws_ctx = NULL;
sws_ctx = sws_getContext(1920, 1080,
          AV_PIX_FMT_YUV420P, 1920, 1080,
          AV_PIX_FMT_YUV420P,
          SWS_BILINEAR,
          NULL,
          NULL,
          NULL);

Я не могу передать AV_PIX_FMT_CUDA в sws_ctx, поскольку он не поддерживается. Большинство примеров, которые я нашел в Интернете, говорят, что следуют этому примеру libav (https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/hw_decode.c). Проблема в том, что на моем декодирующем компьютере нет графического процессора NVIDIA, поэтому я не могу создать аппаратное устройство, как в этом примере. У кого-нибудь есть какие-либо предложения о том, как преобразовать AVFrame, закодированный в пакет, используя "h264_nven c", в AVFrame с форматом YUV420P? Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 января 2020
  1. Если возможно, используйте VDPAU. Просто измените пример с помощью vaapi для работы с vdpau (для декодирования)

  2. Если вы хотите использовать код c от NVIDIA, вы можете использовать код c поиск по имени , например h264_cuvid и работать с ним как с нормальным кодом c. Например, "h264_cuvid"

0 голосов
/ 21 января 2020

Вам не нужно иметь графический процессор для декодирования видео h264. Декодирование процессора (h264) должно быть просто отлично. То, что вы упоминаете, о ускоренном декодировании HW. Нет графического процессора, нет «ускоренного hw» декодирования.

То же самое относится и к кодированию. Для этого у вас также нет графического процессора, программный код c (libx264) будет работать нормально. И вы можете декодировать его, используя либо процессор, либо графический процессор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...