0

私は 98% 完成したアプリを持っていますが、ごく最近、新たに導入されたバグに遭遇しました。アプリは、プレイリストからのサーバーから mp3 を再生します (m3u ファイルではなく、トラック URL の JSON リストのみ)。

トラックの再生が終了したときを除いて、すべてが期待どおりに機能しています。その瞬間、次のトラックが自動的に選択され、UI が更新されます。しかし、トラックは決して再生されません。また、playbackLikelyToKeepUpキー値オブザーバーはトリガーされません。durationその選択された (再生されていない) AVPlayerItem の ... を読み取ることができます。したがって、これは有効なオブジェクトです。

「次へ」を押すか、テーブルビューで行を選択すると、すべてが機能します。私にとって最も奇妙な部分は、ユーザーイベント (「次へ」を押す) と自動再生機能のコードがまったく同じであることです。どちらもcurrentTrackIndexPlaylistManager に設定されており、変更を観察しています。playCurrentTrackこれにより、メソッドがトリガーされます。

何か関係がある可能性はありNSNotificationCenterますか?
これを使用して、現在のトラックの再生が終了したかどうかを確認します。次のようにします。

[[NSNotificationCenter defaultCenter]   addObserver:self
                                        selector:@selector(playerItemDidReachEnd:)
                                        name:AVPlayerItemDidPlayToEndTimeNotification
                                        object:self.currentAudioPlayerItem];

playerItemDidReachEnd次のようになります。

- (void)playerItemDidReachEnd:(NSNotification *)notification {
    // same action as pressing 'next' button in my audioplayer UI controls
    // which is working, I can also see some UI updates ( correct title etc. … )
    [self pressedNext];
}

URLからmp3をロードするときにトリガーされるイベントをブロックして、おそらくスレッドで何かを考えていますか?http トラフィック ツールに mp3 情報が読み込まれているのがわかります。

ありがとう。

4

1 に答える 1

0

いくつかのクラス メソッドをインラインに戻すことで、この問題を (ホット) 修正しました。

  • 共有の audioplayer クラスをインラインに移動しました
  • 新しく選択された AVPlayerItem ごとに新しい audioplayer を作成する
  • プレイヤーが最後に到達したときにセレクターをトリガーする、よりバグの少ない方法を使用します。

    -(void)playerItemDidReachEndNotification{
    // make sure we trigger the selector on the main thread
    [self performSelectorOnMainThread:@selector(playerItemDidReachEnd) withObject:nil waitUntilDone:NO];
    }

このようなもののいくつかは必要ではないと確信していますが、主な目標はそれを再び機能させることでした.
次のイテレーションで真犯人が見つかることを願っています。

于 2012-09-18T10:31:51.353 に答える