无法设置 windows media video 9 屏幕编码器

Posted

技术标签:

【中文标题】无法设置 windows media video 9 屏幕编码器【英文标题】:Cannot setup windows media video 9 screen encoder 【发布时间】:2015-07-10 13:48:17 【问题描述】:

设置输入类型时遇到问题。我收到此错误:

MF_E_INVALIDMEDIATYPE:为媒体类型指定的数据是 此对象无效、不一致或不支持。

有什么解决办法吗? 错误返回SetInputMediaType。 这是输入和输出的设置代码:

hr = MFCreateMediaType(&mediaTypeIn);
hr = mediaTypeIn->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
hr = mediaTypeIn->SetGUID(MF_MT_SUBTYPE,  MFVideoFormat_RGB24);
hr = mediaTypeIn->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
hr = MFSetAttributeSize(mediaTypeIn, MF_MT_FRAME_SIZE, width, height);
hr = MFSetAttributeRatio(mediaTypeIn, MF_MT_FRAME_RATE, fps_num, fps_den);
hr = MFSetAttributeRatio(mediaTypeIn, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);

hr = MFCreateMediaType(&mediaTypeOut);
hr = mediaTypeOut->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video); 
hr = mediaTypeOut->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_MSS2);
hr = mediaTypeOut->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
hr = mediaTypeOut->SetUINT32(MF_MT_AVG_BITRATE, bit_rate);
hr = MFSetAttributeSize(mediaTypeOut, MF_MT_FRAME_SIZE, width, height);
hr = MFSetAttributeRatio(mediaTypeOut, MF_MT_FRAME_RATE, fps_num, fps_den);
hr = MFSetAttributeRatio(mediaTypeOut, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);

hr = vx->sinkWriter->AddStream(mediaTypeOut, &vx->streamIndex);

// No problems before this point, and the call below returns MF_E_INVALIDMEDIATYPE
hr = vx->sinkWriter->SetInputMediaType(vx->streamIndex, mediaTypeIn, NULL);

【问题讨论】:

我没有忽略返回值,我只是取出了打印出来的代码位,这样我就可以使这个问题变得清晰易懂。问题出在 hr = vx->sinkWriter->SetInputMediaType(vx->streamIndex, mediaTypeIn, NULL); hr = 显然只是为了装饰。 @LauraBog 请不要否认我们您拥有的信息。如果你不能解决问题,为什么我们能够用比你更少的知识来解决问题。请出示您的错误检查并报告有关失败和错误代码的完整详细信息。 我在问题中提到:错误是MF_E_INVALIDMEDIATYPE。为媒体类型指定的数据无效、不一致或不受此对象支持。我对 H264 和 Windows Media Video 9 编码器使用了几乎相同的设置功能,并且效果很好。我不明白为什么这个编解码器不起作用。 在问题中我们无法看到哪个调用返回了该值。请编辑问题以使其完整。 【参考方案1】:

你没有告诉我们什么是宽度、高度、fps_num、fps_den 等等。因此,例如,如果宽度为零,您将收到 MF_E_INVALIDMEDIATYPE...

编辑

这是答案:Matt Andrews Microsoft (MSFT)

如本线程前面所述,默认情况下未注册 Microsoft 屏幕编码器。屏幕编码器的 CLSID 是 CLSID_CMSSCEncMediaObject2。如果您想在应用程序中使用它,您要么需要使用 CoCreateInstance 手动创建它,然后将其插入到拓扑中,要么使用 MFTRegisterLocalByCLSID 在本地注册它。

MFVideoFormat_MSS2 默认不存在于系统中。

【讨论】:

我使用相同的值来设置 H264、wmv3 和 microsoft media video 9 编码器,并且没有问题。某些值可能不适用于屏幕编码器,但适用于其他编码器...? 目前,bit_rate = 16000000; fps_num= 30; fps_den = 1;高度 = 1080;宽度 = 1920; 好的,您是否尝试设置其他编码器属性,例如 MFPKEY_ASFOVERHEADPERFRAME 等。 我现在使用一切默认,有超过 20 个属性。我可以尝试设置其中的一些。但是,您认为我使用 sinkwriter 的方式可能会成为这个特定编码器的问题吗?

以上是关于无法设置 windows media video 9 屏幕编码器的主要内容,如果未能解决你的问题,请参考以下文章

html5 视频无法在 Windows 上的 Safari 中播放

Nova video player播放器怎么设置中文

windows media player 有啥没图像!!!

linux之media video分析

这种模式的视频文件怎么弄成windows video player的播放模式啊?

去掉video标签自带的下载按钮