Недавно я следовал этому примеру (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? Спасибо!