背景:Win8用のメトロスタイルのアプリをコーディングしています。音楽ファイルを再生できる必要があります。品質とスペースの要件のため、エンコードされたオーディオ(mp3 / ogg)を使用しています。
XAudio2を使用してサウンドエフェクト(.wavファイル)を再生していますが、エンコードされたオーディオを再生する方法がわからなかったため、Media Foundation(IMFMediaPlayerインターフェイス)で音楽ファイルを再生することにしました。
メトロアプリのサンプルをダウンロードしたところ、Media Engine NativeC++ビデオ再生サンプルが必要なものに最も近いことがわかりました。
私のアプリでMediaPlayerが音楽を再生しているので、問題が発生しました。アプリを実行しているデバイスが十分に遅い場合、MediaPlayerはハングします。デバイスでリリースバージョンのアプリを実行しているときは問題なく、音楽を問題なく聞くことができます。しかし、デバッガーを接続したり、低速のデバイスで実行したりすると、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);
}
}
);
}
);
そして、これがSetBytestreamメソッドです。
SetBytestream(IRandomAccessStream^ streamHandle)
{
if(m_spMFByteStream != nullptr)
{
m_spMFByteStream->Close();
m_spMFByteStream = nullptr;
}
MEDIA::ThrowIfFailed(
MFCreateMFByteStreamOnStreamEx((IUnknown*)streamHandle, &m_spMFByteStream)
);
MEDIA::ThrowIfFailed(
m_spEngineEx->SetSourceFromByteStream(m_spMFByteStream.Get(), m_bstrURL)
);
MEDIA::GetMediaError(m_spEngineEx);
return;
}
それがぶら下がっている線は次のとおりです。
m_spEngineEx->SetSourceFromByteStream(m_spMFByteStream.Get(), m_bstrURL)
アプリをデバッグしているときに、一時停止を押してスタックを確認できます。まあ、それほど多くはありませんが、少なくとも私はそれが無期限にあることがわかります
ntdll.dll!77b7f4dc()
私のアプリがそのようにハングする理由はありますか?
(オプション:c++メトロスタイルのアプリでmp3/ oggを再生するためのより良い方法を知っている場合は、私に知らせてください)