Audio IMFMediaPlayer在SetSourceFromByTestStream期间挂起
背景:我正在为Win8编写一个metro风格的应用程序。我需要能够播放音乐文件。由于质量和空间要求,我们使用编码音频(mp3/ogg) 我使用xOdiO2播放声音效果(.wav文件),但由于我无法找到一种方法来播放编码音频,所以我决定用MediaFoundation(IffMediaPipe接口)播放音乐文件。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播放音乐,我遇到了一个问题。如果运行应用程序的设备
我下载了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()