假设我正在使用av_hwdevice_find_type_by_name("cuda")
,就像在here中一样。我需要使用SwsContext
将解码后的帧转换为RGB。我知道,根据经验,当使用cuda / cuvid解码器时,我得到AV_PIX_FMT_NV12
格式的帧,即使我看到的每个结构都说AV_PIX_FMT_NONE
或AV_PIX_FMT_YUV420P
。
在什么结构的哪个领域我可以获得AV_PIX_FMT_NV12
值,所以我可以在调用SwsContext.sws_scale
时删除我的硬编码源格式?谢谢!
更新:
看起来我可以通过:
AVCodecContext* avctx;
...
frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
AVPixelFormat pixel_fmt = frames_ctx->sw_format;
...一旦解码了至少一帧。不确定这是否是正确的方法。
至于CUDA,你最好的选择是当AV_PIX_FMT_YUV420P
上的AVHWFramesContext::sw_format
认为它是AV_PIX_FMT_NV12
而当AV_PIX_FMT_YUV420P10
它实际上是AV_PIX_FMT_P010
。
据我所知,无论是CUDA还是NVDEC(CUVID)都不支持420格式以外的任何解码帧。