Сбой setinputmediatype кодера Media Foundation h264 с недопустимым типом носителя

Я разместил свой вопрос на форуме MS Media Foundation, и до сих пор никто не смог ответить. Я видел похожие темы с моей проблемой на форумах MS и Stackru, но я не нашел никаких решений. Я настроил конвейер с парой преобразований. Цель этого конвейера состоит в том, чтобы иметь возможность настраивать компоненты, т. Е. Менять приемники носителей и преобразовывать их с помощью пользовательских компонентов по сравнению со встроенными модулями.

Моя проблема с кодировщиком H264. Декодер работает отлично. Я перечисляю кодировщики. Возвращает один кодер H264. Я попытался настроить типы носителей двумя способами. FYI Тип носителя для печати настроен правильно. В соответствии с документацией MS выход должен быть установлен первым. Я устанавливаю только атрибуты IMFTranform, а не атрибуты ICodecAPI. Как только выход настроен, я перехожу к входу.

Есть два способа: 1) создать бланки медиа-типов, установить атрибуты и применить их 2) или получить доступный тип ввода, а затем изменить интересующие меня атрибуты, такие как ширина кадра, высота, частота кадров и режим чересстрочной развертки. SetInputType завершается ошибкой с C00D36D5 (недопустимый тип носителя). Не уверен почему. MFTrace сообщает о сбое, но не дает никаких оснований для того, что отсутствует. Есть идеи? Вот пример кода с настройкой с нуля:

HRESULT MediaFoundationManager::FindEncoder(IMFTransform **decoder, IMFMediaType *type)
{
            HRESULT hr = S_OK;
            UINT32 count = 0;

            CLSID *ppCLSIDs = NULL;

            MFT_REGISTER_TYPE_INFO info = { 0 };
            info.guidMajorType = MFMediaType_Video;
            info.guidSubtype = MFVideoFormat_YUY2;

            MFT_REGISTER_TYPE_INFO outInfo = {0};
            outInfo.guidMajorType = MFMediaType_Video;
            outInfo.guidSubtype = MFVideoFormat_H264;

            hr = MFTEnum(    MFT_CATEGORY_VIDEO_ENCODER,
                    0,          // Reserved
                    &info,       // Input type
                    &outInfo,      // Output type
                    NULL,       // Reserved
                    &ppCLSIDs,
                    &count
                    );

                if (SUCCEEDED(hr) && count == 0)
                    hr = MF_E_TOPO_CODEC_NOT_FOUND;


                if (SUCCEEDED(hr))
                    hr = CoCreateInstance(ppCLSIDs[0], NULL, CLSCTX_ALL, IID_PPV_ARGS(decoder));

                if (SUCCEEDED(hr))
                {
                    ConfigureMFTFromScratch(*decoder,info.guidSubtype,outInfo.guidSubtype, true);                    
                }
            }

            CoTaskMemFree(ppCLSIDs);
            return hr;
 }

void MediaFoundationManager::ConfigureMFTFromScratch(IMFTransform *transform, GUID inputFormat, GUID outputFormat, bool h264)
{
            CComPtr<IMFMediaType> inputMediaType = NULL;
            CComPtr<IMFMediaType> outputMediaType = NULL;

            Helper::CheckHR(MFCreateMediaType(&inputMediaType),"Create Media Type");
            Helper::CheckHR(MFCreateMediaType(&outputMediaType),"Create Media Type");

            Helper::CheckHR(inputMediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),"Set major type");
            Helper::CheckHR(inputMediaType->SetGUID(MF_MT_SUBTYPE, inputFormat),"Set Sub type");
            Helper::CheckHR(MFSetAttributeSize(inputMediaType, MF_MT_FRAME_SIZE,_inputInfo.FrameWidth, _inputInfo.FrameHeight),"Set Frame Size");
            Helper::CheckHR(inputMediaType->SetUINT64(MF_MT_FRAME_RATE, _inputInfo.FrameRate),"Set Frame rate");
            Helper::CheckHR(inputMediaType->SetUINT32(MF_MT_AVG_BITRATE, _inputInfo.BitRate),"Set Bit rate");
            Helper::CheckHR(inputMediaType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlaceMode::MFVideoInterlace_Progressive),"Set Interlace Mode");
            Helper::CheckHR(MFSetAttributeRatio(inputMediaType, MF_MT_PIXEL_ASPECT_RATIO, 1, 1),"Set Aspect Ratio");

            Helper::CheckHR(outputMediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video),"Set major type");
            Helper::CheckHR(outputMediaType->SetGUID(MF_MT_SUBTYPE, outputFormat),"Set Sub type");
            Helper::CheckHR(MFSetAttributeSize(outputMediaType, MF_MT_FRAME_SIZE,_inputInfo.FrameWidth, _inputInfo.FrameHeight),"Set Frame Size");
            Helper::CheckHR(outputMediaType->SetUINT64(MF_MT_FRAME_RATE, _inputInfo.FrameRate),"Set Frame rate");
            Helper::CheckHR(outputMediaType->SetUINT32(MF_MT_AVG_BITRATE, _inputInfo.BitRate),"Set Bit rate");
            Helper::CheckHR(outputMediaType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlaceMode::MFVideoInterlace_Progressive),"Set Interlace Mode");
            Helper::CheckHR(MFSetAttributeRatio(outputMediaType, MF_MT_PIXEL_ASPECT_RATIO, 1, 1),"Set Aspect Ratio");    

            if (h264)
            {
                UINT32 level = -1;
                outputMediaType->SetUINT32(MF_MT_MPEG2_LEVEL, level);
                Helper::CheckHR(outputMediaType->SetUINT32(MF_MT_MPEG2_PROFILE , eAVEncH264VProfile_Main),"Set Profile Mode");
                Helper::CheckHR(transform->SetOutputType(0, outputMediaType, 0),"Set output type");    
                Helper::CheckHR(transform->SetInputType(0, inputMediaType, 0),"Set input type");                    
            }
            else
            {        
                Helper::CheckHR(transform->SetInputType(0, inputMediaType, 0),"Set input type");    
                Helper::CheckHR(transform->SetOutputType(0, outputMediaType, 0),"Set output type");                    
            }
}

Я очень ценю, если вы, ребята, укажете мне правильное направление.

0 ответов

Другие вопросы по тегам