12

アプリの起動時に AVAudioSession を設定し、デリゲートを appDelegate に設定しています。電話が通話を受信したときにデリゲートの beginInterruption が呼び出されていないことを除いて、すべてが機能しているようです (再生など)。呼び出しが終了すると endInterruption が呼び出されます。

私が持っている唯一の考えは、私が使用しているオーディオ プレーヤー コードは以前は AVAudioPlayer に基づいていたが、現在は AVPlayer を使用しているということです。割り込みを処理するための AVAudioPlayer デリゲートのコールバックはまだそこにありますが、何らかの形で競合するのは奇妙に思えます。

4

5 に答える 5

9

ヘッダーを見ると、iOS6 では、AVAudioSessionDelegate が非推奨になっているようです。

AVAudioSessionInterruptionNotificationiOS6 で代わりに使用します。

更新:うまくいきませんでした。フレームワークにバグがあると思います。

はい、私の経験では、beginInterruption も、新しく文書化された AVAudioSessionInterruptionNotification も正しく機能しません。私がしなければならなかったのは、ローカル フラグを使用してプレーヤーのステータスをendInterruption:withFlags:追跡し、中断からの回復を追跡するためにメソッドを処理することでした。

iOS 6 では、中断からの再開により、少なくとも AudioPlayer は適切な場所に保持されるため、AVAudioPlayer の最後の既知の再生時間を保存する必要はなく、再生を押すだけで済みました。

これが私が思いついた解決策です。AVPlayer の常駐時間が長すぎると、iOS 6 がメディア リセットでオーディオを強制終了するようです。結局、AVPlayer は再生されるのですが、音が出ません。AVPlayer のレートは 1 ですが、まったく音が出ません。状況に苦痛を加えるために、問題があることを示す AVAudioSession setActive にも AVPlayer 自体にもエラーはありません。

リモコンのジェスチャーにまったく依存している場合、アプリはすでにバックグラウンドにある可能性があるため、appWillResignActive に依存できないという事実に加えてください。

私が実装した最終的な解決策は、AVPlayer に定期的なオブザーバーを追加し、最後の既知の時間を記録することでした。制御が戻ったというイベントを受け取ると、新しい AVPlayer を作成し、AVPlayerItem を使用してロードし、seekToTime を適切な時間に合わせます。

これは非常に厄介な回避策ですが、少なくとも機能し、発生していた定期的なクラッシュを回避できます。

于 2012-09-14T21:53:00.943 に答える
4

C api を使用して、割り込みが開始されたときに割り込みメソッドも呼び出されないことを確認できます。終わった時だけ

(AudioSessionInitialize (nil, nil, interruptionListenerCallback, (__bridge void *)(self));

また、この問題についてアップルにバグレポートを提出しました。

編集:これは iOS 6.1 で修正されています (iOS 6.0.1 では修正されていません) 。

于 2012-10-04T21:49:18.940 に答える
2

ただ電話してください:

[[AVAudioSession sharedInstance] setDelegate: self];
于 2013-02-01T19:15:19.677 に答える
0

AVPlayeriOS 6.0.x上に新しいオーディオストリーミング( )アプリケーションを作成しましたが、同じ問題が見つかりました。

デリゲートは非推奨になり、通知を使用する必要があります。これはすばらしいことですが、私の調査結果は次のとおりです。

  1. 電話の着信中AVAudioSessionInterruptionTypeEndedは、ハンドラーにのみ表示されAVAudioSessionInterruptionOptionShouldResumeます。オーディオセッションが自動的に中断され(オーディオがフェード)、の再生を再開する必要がありAVPlayerます。
  2. しかし、CSR Racingなどのゲームを起動しようとすると、奇妙なことに恐ろしいAVAudioSessionInterruptionTypeBeganものになりますが、アプリケーションが再生を再開できるときは、ゲームを強制終了することすらできません。

さて、これは私のオーディオカテゴリ(私の場合AVAudioSessionCategoryPlayback)や両方のアプリケーションのミキシング設定(kAudioSessionProperty_OverrideCategoryMixWithOthers)などの他の要因に依存する可能性があります。確かではありませんが、間違いなく何かがおかしいと思います。

うまくいけば、6.1betaでこれは修正され、まだアップグレードする必要があると他の人が報告したので、これから見ていきます。

于 2013-01-01T18:22:46.363 に答える
0

AudioSessionInitialize() で宣言された AudioSessionInterruptionListener コールバック関数にブレークポイントを設定して、iPhone 5 (iOS 6.0 を実行) を確認しました。この割り込みコールバックは、実際には、アプリにアクティブなオーディオ セッションとオーディオがあるときに呼び出されます。ユニットであり、電話の着信で中断されます (Xcode は、中断の開始時にアプリがブレークポイントで停止したことを示しており、そこから続行します)。

アプリにオーディオユニットを停止させ、オーディオセッションを無効にします。次に、割り込みコールバックの終了時に、アプリはオーディオ セッションを再アクティブ化し、問題なくオーディオ ユニットを再起動します (その後、アプリはオーディオを適切に録音しています)。

于 2012-10-31T23:29:46.870 に答える