0

背景: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を再生するためのより良い方法を知っている場合は、私に知らせてください)

4

1 に答える 1

0

なぜこれが起こっているのか理解できませんでしたが、回避策をコーディングすることができました:

IMFSourceReaderMP3をデコードし、バイトをにフィードするために使用できますXAudio2SourceVoice

XAudio2 audio stream effect sampleこれを行う方法の良い例が含まれています。

于 2012-07-24T11:53:33.593 に答える