c++ 0xc00d5212:找不到合适的转换来对内容进行编码或解码

8yoxcaq7  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(182)

我想实现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;
}
jvidinwx

jvidinwx1#

你的问题可以归结为以下几点:MSS2是这个API支持的格式吗?
Sink Writer是编码器和Sink之上的便利层API。当您请求一个.wmv接收器写入器时,API在内部创建一个ASF Media Sink,然后尝试适应您在那里请求的MFVideoFormat_MSS2
我不确定是否支持MSS2,例如Windows Media Encoders没有将其作为列出的格式提及。
我的猜测是,即使有机会配置内部管道来产生MSS2录音,因为没有证据或文档参考,它可能仍然无法通过Sink Writer API实现这一点。
至少我浏览了一下MSDN页面,我没有看到一个清晰的声明,即使是内部级的流水线原语。我想说的屏幕编解码器只是不是一个支持的方案,为汇作家API,你将不得不把更多的自己的努力,以获得文件在这种编码与媒体基金会。

相关问题