22

iPhone 用のインタラクティブなストーリーブック タイプのアプリケーションを開発していますが、最近、デバイスでのオーディオ ミキシングに関するイライラするバグに遭遇しました。

まず、オーディオ セッションをセットアップします。カテゴリをAVAudioSessionCategoryAmbientに設定し、 AVAudioPlayerインスタンスを初期化して再生します。ここで、オーディオの再生中にバックグラウンドで、 MPMoviePlayerController を使用して再生するビデオをプリロードし、その後にprepareToPlayを呼び出します。このようにビデオをプリロードする理由は、かなり厳密なタイミングでキューに合わせてすぐに再生する必要があるためです。

この構成では、オーディオ/ムービーが正常に機能し、それらが混ざり合い、互いに干渉することはありません。ただし、この特定のオーディオ セッション カテゴリでは、デバイスがロックされている間はオーディオを再生し続けることができません。これは、私が本当に必要としている機能です。その結果、別のカテゴリを検討せざるを得なくなりました: AVAudioSessionCategoryPlayback

Apple docs によると、デフォルトでは、このカテゴリは他のオーディオとのミキシングを許可していません。他のオーディオとのミキシングを有効にするために、関連するカテゴリをオーバーライドしています。

OSStatus propertySetError = 0;
UInt32 setProperty = 1;
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(setProperty), &setProperty);
assert(propertySetError == 0);

残念ながら、これでロック中の再生の問題は解決しますが、別の問題が発生します。ビデオが少し途切れてロードされると、AVAudioPlayerオーディオが一時的に中断されます。吃音は小さく、おそらく 1 秒未満ですが、ユーザー エクスペリエンスを混乱させるには十分です。AVAudioSessionCategoryAmbientを使用してビデオをプリロードできるようにするこの関連記事を読みましたが、残念ながら、同じアプローチは新しいカテゴリでは機能しないようです。

リターン コードに従って、オーディオ セッション カテゴリが正常に適用されます。このカテゴリでオーディオ ミキシングを有効にすることが、アンビエント カテゴリによって提供されるミキシング機能と同じではない理由を知っている人はいますか?

4

1 に答える 1

1

同様の問題を解決する最善の方法は、新しいAVPlayer(+1 @adam) を使用し、バックグラウンド オーディオを有効にしてリモート コントロール通知を受信するようにアプリを設定することです。これについては、@MarquelV から次のヒントを得ました。How can you play music from the iPod app while still receive remote control events in your app?

バックグラウンドが正常に機能するようになれば、デバイスがロックされている間もプレイを続けることができるはずです。ああ、キーを に追加することを忘れないでくださいinfo.plist。これは簡単に実行でき、なぜ機能しないのかわかりません。

于 2011-08-16T13:35:29.007 に答える