Низкое качество кодирования H.265 Media Foundation?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Низкое качество кодирования H.265 Media Foundation?

Сообщение Anonymous »

Я пытаюсь кодировать видео с помощью MF H.265, и что бы я ни пытался, качество всегда ниже, чем у видео с теми же настройками, созданного кодировщиками, отличными от MF, например, тем, что использует VideoPad (скажем, ffmpeg) в тот же битрейт 4000.

Videopad создает это видео с плавающим мальчиком. Мое приложение создает это видео. Небо в моем приложении явно хуже при битрейте 6K, тогда как VideoPad имеет битрейт 1K.

Код: Выделить всё

pMediaTypeOutVideo->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
pMediaTypeOutVideo->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_HEVC);

pMediaTypeOutVideo->SetUINT32(MF_MT_AVG_BITRATE, 4000000);
MFSetAttributeSize(pMediaTypeOutVideo, MF_MT_FRAME_SIZE, 1920,1080);
MFSetAttributeRatio(pMediaTypeOutVideo, MF_MT_FRAME_RATE, 25, 1);
MFSetAttributeRatio(pMediaTypeOutVideo, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);
pMediaTypeOutVideo->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
pMediaTypeOutVideo->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_Wide);

CComPtr ca;
hr = pSinkWriter->GetServiceForStream(OutVideoStreamIndex, GUID_NULL, __uuidof(ICodecAPI), (void**)&ca);
if (ca)
{
if (true)
{
VARIANT v = {};
v.vt = VT_BOOL;
v.boolVal  = VARIANT_FALSE;
ca->SetValue(&CODECAPI_AVLowLatencyMode, &v);

}
if (true)
{
VARIANT v = {};
v.vt = VT_UI4;
v.ulVal = 100;
hr = ca->SetValue(&CODECAPI_AVEncCommonQualityVsSpeed, &v);
}

if (true)
{
VARIANT v = {};
v.vt = VT_UI4;
v.ulVal = eAVEncCommonRateControlMode_Quality;
ca->SetValue(&CODECAPI_AVEncCommonRateControlMode, &v);
if (true)
{
VARIANT v = {};
v.vt = VT_UI4;
v.ulVal = 100;
ca->SetValue(&CODECAPI_AVEncCommonQuality, &v);
}
}
}
Несмотря ни на что, качество 4000k остается хуже того, что выдает ffmpeg. Кроме того, eAVEncCommonRateControlMode_Quality и CODECAPI_AVEncCommonQuality, похоже, не вступают в силу (он работает в H.264). Единственный способ добиться лучшего качества — повысить битрейт.

Кроме того, параметр скорости, похоже, не влияет на качество или скорость кодирования.
Даже при разрешении 1000к Видеопад выдает видео без пикселизации неба. Конечно, его скорость 1/100.

Кодеры Media Foundation хуже, чем ffmpeg? Чего мне не хватает?

Изменить: рендеринг с помощью программного обеспечения (

Код: Выделить всё

MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS
на FALSE) также одинаково плохо.

Обновление: попробовал на своем ноутбуке с аппаратным кодером AMD. Аналогичная проблема, при низком битрейте качество ужасное.

Подробнее здесь: https://stackoverflow.com/questions/597 ... n-encoding
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»