假设我正在使用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;
...至少已解码一帧。不确定这是否是正确的方法。
答案 0 :(得分:0)
对于CUDA,最好的选择是当在AV_PIX_FMT_YUV420P
上看到AVHWFramesContext::sw_format
时将其视为AV_PIX_FMT_NV12
,而当AV_PIX_FMT_YUV420P10
实际上是AV_PIX_FMT_P010
时。 / p>
据我所知,CUDA和NVDEC(都是CUVID)都不支持420格式以外的任何其他格式作为解码帧。