Исчезли цвета (проблема цветовой гаммы) с помощью кодера AMD H264 MFT - PullRequest
1 голос
/ 18 марта 2019

Я кодирую видео с помощью Windows Media Foundation, но у меня возникла проблема с аппаратным кодированием с использованием AMDh264Enc. Видео выходит полностью размытым, поэтому, очевидно, существует проблема с цветовой гаммой. Источником видео является снимок экрана из Desktop Duplication, который имеет формат R8G8B8A8 (32-битный ARGB). Я настраиваю типы носителей следующим образом:

 // Set the output video type.
MFCreateMediaType(&pVideoMediaTypeOut));
pVideoMediaTypeOut->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);   
pVideoMediaTypeOut->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264);           
pVideoMediaTypeOut->SetUINT32(MF_MT_AVG_BITRATE, m_VideoBitrate);   
pVideoMediaTypeOut->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
pVideoMediaTypeOut->SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH264VProfile_High)); 
MFSetAttributeSize(pVideoMediaTypeOut, MF_MT_FRAME_SIZE, destWidth, destHeight); 
MFSetAttributeRatio(pVideoMediaTypeOut, MF_MT_FRAME_RATE, m_VideoFps, 1);  
MFSetAttributeRatio(pVideoMediaTypeOut, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);

// Set the input video type.
MFCreateMediaType(&pVideoMediaTypeIn));
pVideoMediaTypeIn->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
pVideoMediaTypeIn->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_ARGB32);
pVideoMediaTypeIn->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_Normal);
pVideoMediaTypeIn->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
MFSetAttributeSize(pVideoMediaTypeIn, MF_MT_FRAME_SIZE, sourceWidth, sourceHeight);
MFSetAttributeRatio(pVideoMediaTypeIn, MF_MT_FRAME_RATE, m_VideoFps, 1);
MFSetAttributeRatio(pVideoMediaTypeIn, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);

Видео, закодированные с помощью видеокодера Microsoft Media Foundation H.264, не имеют проблем. Я связался с двумя примерами видео. 1.mp4 кодируется с помощью AMDh264Enc, 2.mp4 с кодировщиком Microsoft Media Foundation H.264 (программное обеспечение).

Кто-нибудь знает, что вызывает эту проблему?

Примеры видео

1 Ответ

1 голос
/ 27 марта 2019

Мне удалось решить проблему, установив матрицу преобразования YUV в bt.601 (см. MFVideoTransferMatrix_BT601) следующим образом:

pVideoMediaTypeOut->SetUINT32(MF_MT_YUV_MATRIX, MFVideoTransferMatrix_BT601);
...