C++ 在Windows 8上使用媒体引擎播放音乐

C++ 在Windows 8上使用媒体引擎播放音乐,c++,windows-8,c++-cli,directx,directx-11,C++,Windows 8,C++ Cli,Directx,Directx 11,我正在将Windows Phone 8应用程序移植到Windows 8,而媒体引擎库的工作方式似乎有所不同 以下是我在WP8上工作的初始化代码: DX::ThrowIfFailed( MFStartup(MF_VERSION) ); ComPtr<IMFMediaEngineClassFactory> mediaEngineFactory; ComPtr<IMFAttributes> mediaEngineAttributes; // Create th

我正在将Windows Phone 8应用程序移植到Windows 8,而媒体引擎库的工作方式似乎有所不同

以下是我在WP8上工作的初始化代码:

DX::ThrowIfFailed(
    MFStartup(MF_VERSION)
    );
ComPtr<IMFMediaEngineClassFactory> mediaEngineFactory;
ComPtr<IMFAttributes> mediaEngineAttributes;

// Create the class factory for the Media Engine.
DX::ThrowIfFailed(
    CoCreateInstance(CLSID_MFMediaEngineClassFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&mediaEngineFactory))
    );

// Define configuration attributes.
DX::ThrowIfFailed(
    MFCreateAttributes(&mediaEngineAttributes, 1)
    );

ComPtr<MediaEngineNotify> notify = Make<MediaEngineNotify>();
ComPtr<IUnknown> unknownNotify;
DX::ThrowIfFailed(
    notify.As(&unknownNotify)
    );

DX::ThrowIfFailed(
    mediaEngineAttributes->SetUnknown(MF_MEDIA_ENGINE_CALLBACK, unknownNotify.Get())
    );

// Create the Media Engine.
DX::ThrowIfFailed(
    mediaEngineFactory->CreateInstance(0, mediaEngineAttributes.Get(), &m_mediaEngine)
    );
DX::ThrowIfFailed(
MFStartup(MF_版本)
);
ComPtr mediaEngineFactory;
ComPtr mediaEngineAttributes;
//为媒体引擎创建类工厂。
DX::ThrowIfFailed(
CoCreateInstance(CLSID_MFMediaEngineClassFactory、nullptr、CLSCTX_INPROC_服务器、IID_PPV_参数(&mediaEngineFactory))
);
//定义配置属性。
DX::ThrowIfFailed(
MFCreateAttributes(&mediaEngineAttributes,1)
);
ComPtr notify=Make();
ComPtr未知通知;
DX::ThrowIfFailed(
notify.As(&unknownotify)
);
DX::ThrowIfFailed(
mediaEngineAttributes->SetUnknown(MF\u MEDIA\u ENGINE\u回调,unknownNotify.Get())
);
//创建媒体引擎。
DX::ThrowIfFailed(
mediaEngineFactory->CreateInstance(0,mediaEngineAttributes.Get(),&m_mediaEngine)
);
CreateInstance()

我尝试搜索MP3媒体引擎播放的示例,但只能找到视频播放示例


有什么想法吗?

我找到了缺少的属性。我必须添加
MF\u MEDIA\u ENGINE\u AUDIO\u CATEGORY
来指定媒体引擎实际在做什么。以下是一个适用于WP8和WIN8的示例:

#if PLATFORM_WINDOWS8
    DX::ThrowIfFailed(
        MFStartup(MF_VERSION)
        );
#endif
    ComPtr<IMFMediaEngineClassFactory> mediaEngineFactory;
    ComPtr<IMFAttributes> mediaEngineAttributes;

    // Create the class factory for the Media Engine.
    DX::ThrowIfFailed(
        CoCreateInstance(CLSID_MFMediaEngineClassFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&mediaEngineFactory))
        );

    // Define configuration attributes.
    DX::ThrowIfFailed(
        MFCreateAttributes(&mediaEngineAttributes, 1)
        );

    ComPtr<MediaEngineNotify> notify = Make<MediaEngineNotify>();
    ComPtr<IUnknown> unknownNotify;
    DX::ThrowIfFailed(
        notify.As(&unknownNotify)
        );

    DX::ThrowIfFailed(
        mediaEngineAttributes->SetUnknown(MF_MEDIA_ENGINE_CALLBACK, unknownNotify.Get())
        );

    DWORD flags=0;

#if PLATFORM_WINDOWS8
    DX::ThrowIfFailed(
        mediaEngineAttributes->SetUINT32(MF_MEDIA_ENGINE_AUDIO_CATEGORY, AudioCategory_GameMedia)
        );
    flags = MF_MEDIA_ENGINE_AUDIOONLY | MF_MEDIA_ENGINE_REAL_TIME_MODE;
#endif

    // Create the Media Engine.
    DX::ThrowIfFailed(
        mediaEngineFactory->CreateInstance(flags, mediaEngineAttributes.Get(), &m_mediaEngine)
        );
\if PLATFORM\u WINDOWS8
DX::ThrowIfFailed(
MFStartup(MF_版本)
);
#恩迪夫
ComPtr mediaEngineFactory;
ComPtr mediaEngineAttributes;
//为媒体引擎创建类工厂。
DX::ThrowIfFailed(
CoCreateInstance(CLSID_MFMediaEngineClassFactory、nullptr、CLSCTX_INPROC_服务器、IID_PPV_参数(&mediaEngineFactory))
);
//定义配置属性。
DX::ThrowIfFailed(
MFCreateAttributes(&mediaEngineAttributes,1)
);
ComPtr notify=Make();
ComPtr未知通知;
DX::ThrowIfFailed(
notify.As(&unknownotify)
);
DX::ThrowIfFailed(
mediaEngineAttributes->SetUnknown(MF\u MEDIA\u ENGINE\u回调,unknownNotify.Get())
);
DWORD标志=0;
#如果平台为Windows 8
DX::ThrowIfFailed(
mediaEngineAttributes->SetUINT32(MF\u媒体\u引擎\u音频\u类别、音频类别\u游戏媒体)
);
flags=MF_MEDIA_ENGINE_AUDIOONLY | MF_MEDIA_ENGINE_REAL_TIME_MODE;
#恩迪夫
//创建媒体引擎。
DX::ThrowIfFailed(
mediaEngineFactory->CreateInstance(标志、mediaEngineAttributes.Get()、m_mediaEngine)
);

我找到了缺少的属性。我必须添加
MF\u MEDIA\u ENGINE\u AUDIO\u CATEGORY
来指定媒体引擎实际在做什么。以下是一个适用于WP8和WIN8的示例:

#if PLATFORM_WINDOWS8
    DX::ThrowIfFailed(
        MFStartup(MF_VERSION)
        );
#endif
    ComPtr<IMFMediaEngineClassFactory> mediaEngineFactory;
    ComPtr<IMFAttributes> mediaEngineAttributes;

    // Create the class factory for the Media Engine.
    DX::ThrowIfFailed(
        CoCreateInstance(CLSID_MFMediaEngineClassFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&mediaEngineFactory))
        );

    // Define configuration attributes.
    DX::ThrowIfFailed(
        MFCreateAttributes(&mediaEngineAttributes, 1)
        );

    ComPtr<MediaEngineNotify> notify = Make<MediaEngineNotify>();
    ComPtr<IUnknown> unknownNotify;
    DX::ThrowIfFailed(
        notify.As(&unknownNotify)
        );

    DX::ThrowIfFailed(
        mediaEngineAttributes->SetUnknown(MF_MEDIA_ENGINE_CALLBACK, unknownNotify.Get())
        );

    DWORD flags=0;

#if PLATFORM_WINDOWS8
    DX::ThrowIfFailed(
        mediaEngineAttributes->SetUINT32(MF_MEDIA_ENGINE_AUDIO_CATEGORY, AudioCategory_GameMedia)
        );
    flags = MF_MEDIA_ENGINE_AUDIOONLY | MF_MEDIA_ENGINE_REAL_TIME_MODE;
#endif

    // Create the Media Engine.
    DX::ThrowIfFailed(
        mediaEngineFactory->CreateInstance(flags, mediaEngineAttributes.Get(), &m_mediaEngine)
        );
\if PLATFORM\u WINDOWS8
DX::ThrowIfFailed(
MFStartup(MF_版本)
);
#恩迪夫
ComPtr mediaEngineFactory;
ComPtr mediaEngineAttributes;
//为媒体引擎创建类工厂。
DX::ThrowIfFailed(
CoCreateInstance(CLSID_MFMediaEngineClassFactory、nullptr、CLSCTX_INPROC_服务器、IID_PPV_参数(&mediaEngineFactory))
);
//定义配置属性。
DX::ThrowIfFailed(
MFCreateAttributes(&mediaEngineAttributes,1)
);
ComPtr notify=Make();
ComPtr未知通知;
DX::ThrowIfFailed(
notify.As(&unknownotify)
);
DX::ThrowIfFailed(
mediaEngineAttributes->SetUnknown(MF\u MEDIA\u ENGINE\u回调,unknownNotify.Get())
);
DWORD标志=0;
#如果平台为Windows 8
DX::ThrowIfFailed(
mediaEngineAttributes->SetUINT32(MF\u媒体\u引擎\u音频\u类别、音频类别\u游戏媒体)
);
flags=MF_MEDIA_ENGINE_AUDIOONLY | MF_MEDIA_ENGINE_REAL_TIME_MODE;
#恩迪夫
//创建媒体引擎。
DX::ThrowIfFailed(
mediaEngineFactory->CreateInstance(标志、mediaEngineAttributes.Get()、m_mediaEngine)
);

我找到了缺少的属性。我必须添加
MF\u MEDIA\u ENGINE\u AUDIO\u CATEGORY
来指定媒体引擎实际在做什么。以下是一个适用于WP8和WIN8的示例:

#if PLATFORM_WINDOWS8
    DX::ThrowIfFailed(
        MFStartup(MF_VERSION)
        );
#endif
    ComPtr<IMFMediaEngineClassFactory> mediaEngineFactory;
    ComPtr<IMFAttributes> mediaEngineAttributes;

    // Create the class factory for the Media Engine.
    DX::ThrowIfFailed(
        CoCreateInstance(CLSID_MFMediaEngineClassFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&mediaEngineFactory))
        );

    // Define configuration attributes.
    DX::ThrowIfFailed(
        MFCreateAttributes(&mediaEngineAttributes, 1)
        );

    ComPtr<MediaEngineNotify> notify = Make<MediaEngineNotify>();
    ComPtr<IUnknown> unknownNotify;
    DX::ThrowIfFailed(
        notify.As(&unknownNotify)
        );

    DX::ThrowIfFailed(
        mediaEngineAttributes->SetUnknown(MF_MEDIA_ENGINE_CALLBACK, unknownNotify.Get())
        );

    DWORD flags=0;

#if PLATFORM_WINDOWS8
    DX::ThrowIfFailed(
        mediaEngineAttributes->SetUINT32(MF_MEDIA_ENGINE_AUDIO_CATEGORY, AudioCategory_GameMedia)
        );
    flags = MF_MEDIA_ENGINE_AUDIOONLY | MF_MEDIA_ENGINE_REAL_TIME_MODE;
#endif

    // Create the Media Engine.
    DX::ThrowIfFailed(
        mediaEngineFactory->CreateInstance(flags, mediaEngineAttributes.Get(), &m_mediaEngine)
        );
\if PLATFORM\u WINDOWS8
DX::ThrowIfFailed(
MFStartup(MF_版本)
);
#恩迪夫
ComPtr mediaEngineFactory;
ComPtr mediaEngineAttributes;
//为媒体引擎创建类工厂。
DX::ThrowIfFailed(
CoCreateInstance(CLSID_MFMediaEngineClassFactory、nullptr、CLSCTX_INPROC_服务器、IID_PPV_参数(&mediaEngineFactory))
);
//定义配置属性。
DX::ThrowIfFailed(
MFCreateAttributes(&mediaEngineAttributes,1)
);
ComPtr notify=Make();
ComPtr未知通知;
DX::ThrowIfFailed(
notify.As(&unknownotify)
);
DX::ThrowIfFailed(
mediaEngineAttributes->SetUnknown(MF\u MEDIA\u ENGINE\u回调,unknownNotify.Get())
);
DWORD标志=0;
#如果平台为Windows 8
DX::ThrowIfFailed(
mediaEngineAttributes->SetUINT32(MF\u媒体\u引擎\u音频\u类别、音频类别\u游戏媒体)
);
flags=MF_MEDIA_ENGINE_AUDIOONLY | MF_MEDIA_ENGINE_REAL_TIME_MODE;
#恩迪夫
//创建媒体引擎。
DX::ThrowIfFailed(
mediaEngineFactory->CreateInstance(标志、mediaEngineAttributes.Get()、m_mediaEngine)
);

我找到了缺少的属性。我必须添加
MF\u MEDIA\u ENGINE\u AUDIO\u CATEGORY
来指定媒体引擎实际在做什么。以下是一个适用于WP8和WIN8的示例:

#if PLATFORM_WINDOWS8
    DX::ThrowIfFailed(
        MFStartup(MF_VERSION)
        );
#endif
    ComPtr<IMFMediaEngineClassFactory> mediaEngineFactory;
    ComPtr<IMFAttributes> mediaEngineAttributes;

    // Create the class factory for the Media Engine.
    DX::ThrowIfFailed(
        CoCreateInstance(CLSID_MFMediaEngineClassFactory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&mediaEngineFactory))
        );

    // Define configuration attributes.
    DX::ThrowIfFailed(
        MFCreateAttributes(&mediaEngineAttributes, 1)
        );

    ComPtr<MediaEngineNotify> notify = Make<MediaEngineNotify>();
    ComPtr<IUnknown> unknownNotify;
    DX::ThrowIfFailed(
        notify.As(&unknownNotify)
        );

    DX::ThrowIfFailed(
        mediaEngineAttributes->SetUnknown(MF_MEDIA_ENGINE_CALLBACK, unknownNotify.Get())
        );

    DWORD flags=0;

#if PLATFORM_WINDOWS8
    DX::ThrowIfFailed(
        mediaEngineAttributes->SetUINT32(MF_MEDIA_ENGINE_AUDIO_CATEGORY, AudioCategory_GameMedia)
        );
    flags = MF_MEDIA_ENGINE_AUDIOONLY | MF_MEDIA_ENGINE_REAL_TIME_MODE;
#endif

    // Create the Media Engine.
    DX::ThrowIfFailed(
        mediaEngineFactory->CreateInstance(flags, mediaEngineAttributes.Get(), &m_mediaEngine)
        );
\if PLATFORM\u WINDOWS8
DX::ThrowIfFailed(
MFStartup(MF_版本)
);
#恩迪夫
ComPtr mediaEngineFactory;
ComPtr mediaEngineAttributes;
//为媒体引擎创建类工厂。
DX::ThrowIfFailed(
CoCreateInstance(CLSID_MFMediaEngineClassFactory、nullptr、CLSCTX_INPROC_服务器、IID_PPV_参数(&mediaEngineFactory))
);
//定义配置属性。
DX::ThrowIfFai