#ffmpeg #libav
#ffmpeg #libav
Вопрос:
Допустим, я использую av_hwdevice_find_type_by_name("cuda")
, как здесь. Мне нужно преобразовать декодированные кадры в RGB с помощью SwsContext
. Я знаю по опыту, что при использовании декодера 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;
…как только хотя бы один кадр был декодирован. Хотя не уверен, что это правильный способ.
Ответ №1:
Что касается CUDA, то лучшим выбором будет, когда вы AV_PIX_FMT_YUV420P
на AVHWFramesContext::sw_format
рассматриваете это как AV_PIX_FMT_NV12
и когда AV_PIX_FMT_YUV420P10
это на самом деле AV_PIX_FMT_P010
.
Насколько я знаю, ни CUDA, ни NVDEC (был CUVID) не поддерживают ничего, кроме формата 420, в качестве декодированных кадров.
Комментарии:
1. Это в основном то, что я уже делаю, и чего я хочу избежать (например, предполагая что-то, основанное на предварительных знаниях). Но смотрите Мое обновление выше, я действительно могу получить AV_PIX_FMT_NV12 во время выполнения сейчас. Просто интересно, правильный ли это / универсальный способ.
2. Возможно, после декодирования то, что вы сделали, является правильным способом. Я предполагал перед декодированием.