我最近按照这个示例(https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/vaapi_encode.c)使用 NVENC 对 AVFrame 进行编码(通过将 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 GPU,所以我不能像他们在这个例子中那样创建硬件设备。有人对如何将使用“h264_nvenc”编码为数据包的 AVFrame 转换为格式为 YUV420P 的 AVFrame 有任何建议吗?谢谢!