動画の再生中に、レート変更の通知AVPlayer
が表示されますが、アプリのアクティビティに関連していないようです。
UIApplicationDidEnterBackgroundNotification
アプリが通知を受け取ったら、 AVPlayer
toに伝えpause
ます。ロジックは、ユーザーが去ったのと同じ場所でフォアグラウンドに戻る必要があるということです。バックグラウンドに行くときに呼び出さなければpause
、問題は発生しません。
プレーヤーに送信されるイベントのシーケンスはpause
、、、seekToTime:
ですplay
。通常、これは正常に機能しますが、アプリがバックグラウンドに送信されてからフォアグラウンドに戻された後、play
呼び出しごとにAVPlayer
. 1 つ目は 1 に、2 つ目は直後に 0 に設定されます。このパターンは、 -[AVPlayer play]
そのプレーヤー インスタンスが使用されている限り、 への呼び出しごとに繰り返されます。
ブレークポイントを設定できますが、レートが 0 に変更されたときにブレークポイントがヒットすることはありません。呼び出し-[AVPlayer pause]
をコメントアウトすると、問題は解決します。seekToTime:
を使用すると、ブロックのパラメーターはですseekToTime:completionHandler:
が、同じ問題が発生します。finished
YES
「これを修正するにはどうすればよいですか」とは別に、/AVPlayer
に接続されていないレート変更の理由を検出する方法の詳細に興味があります。(ブレークポイントを設定しても決してトリガーされないようです。)play
pause
-[AVPlayer setRate:]
(ほとんど有効な回避策の 1 つは、バックグラウンドに入るときにプレイヤーの位置を保存し、再生させ、フォアグラウンドに戻るときに位置を修正することです。これには、オーディオ レベルの操作も必要であり、おそらく実行可能ですが、別の問題はすべてのバックグラウンド通知が、ビューが隠れていることを示しているわけではありません (例: ホーム ボタンをダブルタップ)。
提案?
(最後の追加情報: 私が試したすべてのケースで、バックグラウンドから戻って、その後、シークを実行しました.頻度を減らすためにできることはありますが、AVPlayer を取り除き、新しいインスタンスを作成する以外に、それを排除するものはありません.これにより、非常に長い遅延が発生しますが、完全な誤動作よりはましです.推測してみて。
シーク距離が結果に影響するという証拠がいくつかあります。これは、エラーが基になるバッファリング メカニズムにある可能性を示唆しています。レートの変化の原因 (再生/一時停止以外) がわからないと、さらに調査する方法がわかりません。)