1

ストリーム コンテンツを再生するオーディオ アプリがあります。問題は、信号が弱い場合、再生が停止することがあります。ネットワークはまだ到達可能ですが、バッファが空になったようです。

プレイヤーのステータスの変化を監視するオブザーバーを実装しようとしましたが、機能していません。メソッドが呼び出されません。

特殊性として、AVPlayer インスタンスは AppDelegate にあります。これは、複数のビューがあり、プレーヤーは表示されているビューを再生し続ける必要があるためです。ここにサンプルコードの一部があります:

- (void)viewDidLoad
    {
        [super viewDidLoad];
        isPlaying = false;
        playButton.enabled = NO;

        //Add en observer for reachability change
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(reachabilityChanged:) 
                                                     name:kReachabilityChangedNotification
                                                   object:nil];

        //Adding the observer for player's status change
        AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        [delegate.player addObserver:self forKeyPath:@"status" options:0 context:playerStatusContext];

        [self initPlayer];
    }


    //Event raised whenever the current status of the player change
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

        UIAlertView *alert = [UIAlertView alloc];
        NSString *chaineConcat = @"Entering observer method..."];
        [alert initWithTitle:@"Test" message:chaineConcat delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];   
        [alert show];

        if (context == playerStatusContext) {
            AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
            NSString *statusPlayer = nil; 
            if (object == delegate.player && [keyPath isEqualToString:@"status"]) {
                if (delegate.player.status == AVPlayerStatusReadyToPlay) {
                    statusPlayer = @"Everything's OK";
                } else if (delegate.player.status == AVPlayerStatusFailed) {
                    statusPlayer = @"Houston, we have a problem";
                }
            }
            [self syncUI];

            UIAlertView *alert = [UIAlertView alloc];
            NSString *chaineConcat = [NSString stringWithFormat:@"%@/%@/", @"Player status' is ", statusPlayer];
            [alert initWithTitle:@"Test" message:chaineConcat delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];   
            [alert show];

        }else {
            [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        }

        return;
    }

- (void) initPlayer {

    // Load the array with the sample file
    NSString *urlAddress = @"http://MYSTREAMURL";

    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    //Create a URL object.
    delegate.urlStream = [NSURL URLWithString:urlAddress];

    //Reinit AVPlayer
    delegate.player = [AVPlayer playerWithURL:delegate.urlStream];

}

イベントが発生しない理由を知っている人はいますか? メソッドに 2 つのアラートがありますが、誰も起動されません。つまり、メソッドに入らないということです。このすべての目標は、これが発生した場合にプレーヤーが再起動する方法を実装しようとすることです。

ありがとう !

4

2 に答える 2

1

監視するオブジェクトを作成する前に、オブザーバーを追加しようとしています。nilオブジェクトにメッセージを送信しているだけです。
呼び出す-initPlayer前に呼び出し-addObserver:forKeyPath:options:context:ます。

于 2013-03-14T22:06:33.993 に答える