2014-01-11 31 views
0

我將Windows Phone 8應用程序移植到Windows 8,似乎Media Engine庫的工作方式不同。在Windows上使用Media Engine播放音樂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) 
    ); 

CreateInstance()拋出0xc00d36e6異常(MF_E_ATTRIBUTENOTFOUND)。

我試着搜索媒體引擎播放MP3的樣本,但只能找到視頻播放樣本。

任何想法?

回答

3

我想出了缺失的屬性。我不得不添加MF_MEDIA_ENGINE_AUDIO_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) 
     );