Video 媒体基础H264编码器SETIN PediaType失败,媒体类型无效 我在MS MediaFoundation论坛上发布了我的问题,到目前为止还没有人能够回应。我在MS论坛和Stackoverflow上看到过类似的帖子,但我没有找到任何解决方案。 我已经设置了一个带有两个转换的管道。此管道的目的是能够自定义组件,即交换媒体接收器并使用自定义组件与内置组件进行转换

Video 媒体基础H264编码器SETIN PediaType失败,媒体类型无效 我在MS MediaFoundation论坛上发布了我的问题,到目前为止还没有人能够回应。我在MS论坛和Stackoverflow上看到过类似的帖子,但我没有找到任何解决方案。 我已经设置了一个带有两个转换的管道。此管道的目的是能够自定义组件,即交换媒体接收器并使用自定义组件与内置组件进行转换,video,h.264,ms-media-foundation,encoder,Video,H.264,Ms Media Foundation,Encoder,我的问题是H264编码器。解码器工作正常。我列举编码器。它返回一个H264编码器。我试着用两种方式设置媒体类型。FYI输出媒体类型设置正确。根据MS文档,需要首先设置输出。我只设置IMFTranform属性,不设置ICodecAPI属性。一旦设置了输出,我就转到输入 两种方法是: 1) 创建空白媒体类型,设置属性并应用它们2)或获取可用的输入类型,然后修改我感兴趣的属性,如帧宽度、高度、帧速率和隔行模式。SetInputType与C00D36D5(无效媒体类型)一起失败。不知道为什么。MFTra

我的问题是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");                    
            }
}
HRESULT MediaFoundationManager::FindCoder(IMFTTransform**解码器,IMFMediaType*类型)
{
HRESULT hr=S_正常;
UINT32计数=0;
CLSID*ppCLSIDs=NULL;
MFT_寄存器_类型_信息={0};
info.guidMajorType=MFMediaType\u视频;
info.guidSubtype=MFVideoFormat_YUY2;
MFT_寄存器_类型_信息outInfo={0};
outInfo.guidMajorType=MFMediaType\u视频;
outInfo.guidSubtype=MFVideoFormat_H264;
hr=MFTEnum(MFT\U类别\U视频\U编码器,
0,//保留
&info,//输入类型
&outInfo,//输出类型
NULL,//保留
&ppCLSIDs,
&计数
);
if(成功(hr)&&count==0)
hr=MF\u E\u TOPO\u未找到编解码器;
如果(成功(hr))
hr=CoCreateInstance(ppCLSIDs[0],NULL,CLSCTX_ALL,IID_PPV_ARGS(解码器));
如果(成功(hr))
{
ConfigureMFTFromScratch(*解码器,info.guidSubtype,outInfo.guidSubtype,true);
}
}
CoTaskMemFree(ppCLSIDs);
返回人力资源;
}
void MediaFoundationManager::ConfigureMFTFromScratch(IMFTTransform*转换、GUID inputFormat、GUID outputFormat、bool h264)
{
CComPtr inputMediaType=NULL;
CComPtr outputMediaType=NULL;
Helper::CheckHR(MFCreateMediaType(&inputMediaType),“创建媒体类型”);
Helper::CheckHR(MFCreateMediaType(&outputMediaType),“创建媒体类型”);
Helper::CheckHR(inputMediaType->SetGUID(MF\u MT\u MAJOR\u TYPE,MFMediaType\u Video),“Set MAJOR TYPE”);
Helper::CheckHR(inputMediaType->SetGUID(MF\u MT\u子类型,inputFormat),“Set子类型”);
Helper::CheckHR(MFSetAttributeSize(inputMediaType、MF\u MT\u FRAME\u SIZE、\u inputInfo.FrameWidth、\u inputInfo.FrameHeight)、“设置帧大小”);
Helper::CheckHR(inputMediaType->SetUINT64(MF\u MT\u FRAME\u RATE,\u inputInfo.FrameRate),“设置帧速率”);
Helper::CheckHR(inputMediaType->SetUINT32(MF_MT_AVG_BITRATE,_inputInfo.BITRATE),“设置比特率”);
Helper::CheckHR(inputMediaType->SetUINT32(MF_MT_INTERLACE_模式,MFVideoInterlace模式::MFVideoInterlace_Progressive),“设置INTERLACE模式”);
Helper::CheckHR(MFSetAttributeRatio(inputMediaType,MF\u MT\u PIXEL\u ASPECT\u RATIO,1,1),“设置ASPECT RATIO”);
Helper::CheckHR(outputMediaType->SetGUID(MF\u MT\u MAJOR\u TYPE,MFMediaType\u Video),“Set MAJOR TYPE”);
Helper::CheckHR(outputMediaType->SetGUID(MF\u MT\u子类型,outputFormat),“Set子类型”);
Helper::CheckHR(MFSetAttributeSize(outputMediaType、MF\u MT\u FRAME\u SIZE、\u inputInfo.FrameWidth、\u inputInfo.FrameHeight)、“设置帧大小”);
Helper::CheckHR(outputMediaType->SetUINT64(MF\u MT\u FRAME\u RATE,\u inputInfo.FrameRate),“设置帧速率”);
Helper::CheckHR(outputMediaType->SetUINT32(MF\u MT\u AVG\u比特率,\u inputInfo.BITRATE),“设置比特率”);
Helper::CheckHR(outputMediaType->SetUINT32(MF_MT_INTERLACE_MODE,MFVideoInterlace MODE::MFVideoInterlace_Progressive),“设置INTERLACE MODE”);
Helper::CheckHR(MFSetAttributeRatio(outputMediaType,MF\u MT\u PIXEL\u ASPECT\u RATIO,1,1),“设置ASPECT RATIO”);
如果(h264)
{
UINT32级别=-1;
outputMediaType->SetUINT32(MF\U MT\U MPEG2\U级别,级别);
Helper::CheckHR(outputMediaType->SetUINT32(MF_MT_MPEG2_PROFILE,eavench264vpprofile_Main),“设置配置文件模式”);
Helper::CheckHR(transform->SetOutputType(0,outputMediaType,0),“设置输出类型”);
Helper::CheckHR(转换->设置输入类型(0,inputMediaType,0),“设置输入类型”);
}
其他的
{        
Helper::CheckHR(转换->设置输入类型(0,inputMediaType,0),“设置输入类型”);
Helper::CheckHR(transform->SetOutputType(0,outputMediaType,0),“设置输出类型”);
}
}

如果你们能给我指出正确的方向,我将不胜感激。

请在问题中直接包含示例代码,而不是链接到外部论坛。@b4hand:对不起,我会添加它。感谢您是否尝试为MFTrace指定更详细的输出?Topoedit也是测试拓扑的好工具。@AlekseyKabanov MSFT是的,MFtrace只会提到失败。我设法解决了与文档相矛盾的问题。“不完全是这样。”阿列克谢卡巴诺夫说