Audio IMFMediaPlayer在SetSourceFromByTestStream期间挂起

Audio IMFMediaPlayer在SetSourceFromByTestStream期间挂起,audio,windows-runtime,ms-media-foundation,Audio,Windows Runtime,Ms Media Foundation,背景:我正在为Win8编写一个metro风格的应用程序。我需要能够播放音乐文件。由于质量和空间要求,我们使用编码音频(mp3/ogg) 我使用xOdiO2播放声音效果(.wav文件),但由于我无法找到一种方法来播放编码音频,所以我决定用MediaFoundation(IffMediaPipe接口)播放音乐文件。 我下载了MediaApppsTestle,发现媒体引擎原生C++视频回放样本最接近我需要的。 现在我的应用程序中有MediaPlayer播放音乐,我遇到了一个问题。如果运行应用程序的设备

背景:我正在为Win8编写一个metro风格的应用程序。我需要能够播放音乐文件。由于质量和空间要求,我们使用编码音频(mp3/ogg)

我使用xOdiO2播放声音效果(.wav文件),但由于我无法找到一种方法来播放编码音频,所以我决定用MediaFoundation(IffMediaPipe接口)播放音乐文件。

我下载了MediaApppsTestle,发现媒体引擎原生C++视频回放样本最接近我需要的。 现在我的应用程序中有MediaPlayer播放音乐,我遇到了一个问题。如果运行应用程序的设备速度足够慢,MediaPlayer将挂起。当我在我的设备上运行应用程序的发布版本时,它很好,我可以很好地听到音乐。但是,当我附加调试器或在较慢的设备上运行调试器时,当我设置ByTestStream以便MediaPlayer播放时,调试器将挂起

下面是一些代码,您会发现它与示例非常相似:

StorageFolder^ installedLocation = Windows::ApplicationModel::Package::Current->InstalledLocation;  
m_pickFileTask = Concurrency::task<StorageFile^>(installedLocation->GetFileAsync(filename)), m_tcs.get_token());    
auto player = this;
m_pickFileTask.then([player](StorageFile^ fileHandle)
{
    player->SetURL(fileHandle->Path);
    Concurrency::task<IRandomAccessStream^> fOpenStreamTask = Concurrency::task<IRandomAccessStream^> (fileHandle->OpenAsync(Windows::Storage::FileAccessMode::Read));
    fOpenStreamTask.then([player](IRandomAccessStream^ streamHandle)
        {                               
            MEDIA::ThrowIfFailed(
                    player->m_spMediaEngine->Pause()
                    );
            MEDIA::GetMediaError(player->m_spMediaEngine);

            player->SetBytestream(streamHandle);                        
            if (player->m_spMediaEngine)
            {
                MEDIA::ThrowIfFailed(
                    player->m_spEngineEx->Play()
                    );
                MEDIA::GetMediaError(player->m_spMediaEngine);
            }
        }
    );      
}
);
它悬挂的线路是:

m_spEngineEx->SetSourceFromByteStream(m_spMFByteStream.Get(), m_bstrURL)
调试应用程序时,我可以按pause键查看堆栈。嗯,不多,但至少我可以看到它是无限期的

ntdll.dll!77b7f4dc()
你知道为什么我的应用程序会以这种方式挂起吗


< P>(可选:如果你知道在C++ Metro应用程序中播放MP3/OGG的更好方法,请让我知道)

不能弄清楚为什么会发生这种情况,但我成功地编写了一个工作循环:

IMFSourceReader
可用于解码MP3并将字节送入
XAudio2SourceVoice

XAudio2音频流效果示例
包含了很好的示例

ntdll.dll!77b7f4dc()