我想实现SinkWriter编码RGB32屏幕帧与Windows Media Video 9屏幕编码器(MSS2)使用Media Foundation。在Visual Studio 2022中运行程序后,我在执行IMFSinkWriter::SetInputMediaType
时遇到了以下问题:0xc00d5212 : No suitable transform was found to encode or decode the content.
我想我包括了所有必要的头文件和库。我还检查了System32文件夹中是否有WMVSENCD.DLL文件。当我为H264编码器和MP4文件运行这段代码时,它工作得很好。你知道如何解决这个问题吗?
下面是我的代码:
HRESULT MediaFoundationScreenRecorder::InitializeSinkWriter(IMFSinkWriter** ppWriter, DWORD* pStreamIndex)
{
*ppWriter = NULL;
*pStreamIndex = NULL;
IMFSinkWriter* pSinkWriter = NULL;
IMFMediaType* pMediaTypeOut = NULL;
IMFMediaType* pMediaTypeIn = NULL;
DWORD streamIndex;
HRESULT hr = MFCreateSinkWriterFromURL(L"mfoutput.wmv", NULL, NULL, &pSinkWriter);
hr |= MFCreateMediaType(&pMediaTypeOut);
hr |= pMediaTypeOut->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
hr |= pMediaTypeOut->SetGUID(MF_MT_SUBTYPE, MEDIASUBTYPE_MSS2);
hr |= pMediaTypeOut->SetUINT32(MF_MT_AVG_BITRATE, 800000);
hr |= pMediaTypeOut->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
hr |= MFSetAttributeSize(pMediaTypeOut, MF_MT_FRAME_SIZE, SCALED_VIDEO_WIDTH, SCALED_VIDEO_HEIGHT);
hr |= MFSetAttributeRatio(pMediaTypeOut, MF_MT_FRAME_RATE, VIDEO_FPS, 1);
hr |= MFSetAttributeRatio(pMediaTypeOut, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);
hr |= pSinkWriter->AddStream(pMediaTypeOut, &streamIndex);
hr |= MFCreateMediaType(&pMediaTypeIn);
hr |= pMediaTypeIn->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
hr |= pMediaTypeIn->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_RGB32);
hr |= pMediaTypeIn->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive);
hr |= MFSetAttributeSize(pMediaTypeIn, MF_MT_FRAME_SIZE, SCALED_VIDEO_WIDTH, SCALED_VIDEO_HEIGHT);
hr |= MFSetAttributeRatio(pMediaTypeIn, MF_MT_FRAME_RATE, VIDEO_FPS, 1);
hr |= MFSetAttributeRatio(pMediaTypeIn, MF_MT_PIXEL_ASPECT_RATIO, 1, 1);
hr |= pSinkWriter->SetInputMediaType(streamIndex, pMediaTypeIn, NULL);
hr |= pSinkWriter->BeginWriting();
if (SUCCEEDED(hr))
{
*ppWriter = pSinkWriter;
(*ppWriter)->AddRef();
*pStreamIndex = streamIndex;
}
SafeRelease(&pSinkWriter);
SafeRelease(&pMediaTypeOut);
SafeRelease(&pMediaTypeIn);
return hr;
}
1条答案
按热度按时间jvidinwx1#
你的问题可以归结为以下几点:MSS2是这个API支持的格式吗?
Sink Writer是编码器和Sink之上的便利层API。当您请求一个.wmv接收器写入器时,API在内部创建一个ASF Media Sink,然后尝试适应您在那里请求的
MFVideoFormat_MSS2
。我不确定是否支持MSS2,例如Windows Media Encoders没有将其作为列出的格式提及。
我的猜测是,即使有机会配置内部管道来产生MSS2录音,因为没有证据或文档参考,它可能仍然无法通过Sink Writer API实现这一点。
至少我浏览了一下MSDN页面,我没有看到一个清晰的声明,即使是内部级的流水线原语。我想说的屏幕编解码器只是不是一个支持的方案,为汇作家API,你将不得不把更多的自己的努力,以获得文件在这种编码与媒体基金会。