Как получить уведомление о статусе потокового аудио от AVPlayer? - PullRequest
1 голос
/ 20 марта 2012

Я использую AVPlayer для потоковой передачи некоторого живого аудио HTTP, а не AVAudioPlayer, который не поддерживает потоковую потоковую передачу HTTP HTTP, вопрос в том, как мне получить статус текущего воспроизведения?Например:

Нажмите кнопку воспроизведения -> [Загрузка] -> [Воспроизведение] Нажмите кнопку паузы -> [Приостановлено]

Мне нужно показать счетчик при загрузке, показать кнопку паузы припри воспроизведении и показе кнопки воспроизведения, когда она приостановлена, я знаю, что могу наблюдать свойства «status» и «rate» AVPlayer:

rate: текущая скорость воспроизведения.0.0 означает «остановлено», 1.0 означает «воспроизведение с естественной скоростью текущего элемента».

status: указывает, можно ли использовать проигрыватель для воспроизведения.

AVPlayerStatusUnknown,
AVPlayerStatusReadyToPlay,
AVPlayerStatusFailed

, поэтому имеетсянет способа указать, что звук «ЗАГРУЗКА», и после изменения состояния на AVPlayerStatusReadyToPlay, по-прежнему требуется некоторое время для воспроизведения звука (возможно, потому что это живой звук).

Но в любом случае, как сделатьЯ получаю правильный статус текущего воспроизведения?Я знаю, что есть AudioStream от Matt, но он не поддерживает HTTP Live audio.

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 21 июня 2012

Я использовал

    [self.mPlayerItem addObserver:self 
                   forKeyPath:kStatusKey 
                      options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
                      context:AVPlayerDemoPlaybackViewControllerStatusObservationContext];

, чтобы контролировать статусную клавишу («статус»).Затем я создал плеер

[self setPlayer:[AVPlayer playerWithPlayerItem:self.mPlayerItem]];  

И в наблюдаемом ValForForKeyPath

    if (context == AVPlayerDemoPlaybackViewControllerStatusObservationContext)
{        
    AVPlayerStatus status = [[change objectForKey:NSKeyValueChangeNewKey] integerValue];
    switch (status)
    {
            /* Indicates that the status of the player is not yet known because 
             it has not tried to load new media resources for playback */
        case AVPlayerStatusUnknown:
        {
            [lblvalidation setText:@"Loading..."];

            NSLog(@"AVPlayerStatusUnknown");
        }
            break;

        case AVPlayerStatusReadyToPlay:
        {
            /* Once the AVPlayerItem becomes ready to play, i.e. 
             [playerItem status] == AVPlayerItemStatusReadyToPlay,
             its duration can be fetched from the item. */

            NSLog(@"AVPlayerStatusReadyToPlay");

            [self.player play];
            [lblvalidation setText:@"Playing..."];
        }
            break;

        case AVPlayerStatusFailed:
        {
            [lblvalidation setText:@"Error..."];
            NSLog(@"AVPlayerStatusFailed");
        }
            break;
    }
}

это работает для меня ... Надеюсь, это поможет вам.

1 голос
/ 02 февраля 2016

Обновлено для Swift 2:

 private var AVPlayerDemoPlaybackViewControllerStatusObservationContext = 0

Добавить наблюдателя:

player.currentItem!.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.New, context: &AVPlayerDemoPlaybackViewControllerStatusObservationContext)

Наблюдатель

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {

    if context == &AVPlayerDemoPlaybackViewControllerStatusObservationContext {
        if let change = change as? [String: Int]
        {
            let status = change[NSKeyValueChangeNewKey]!

            switch status {
            case AVPlayerStatus.Unknown.rawValue:
                print("The status of the player is not yet known because it has not tried to load new media resources for playback")

            case AVPlayerStatus.ReadyToPlay.rawValue:
                self.playButtonPressed(playButton)
                print("The player is Ready to Play")

            case AVPlayerStatus.Failed.rawValue:
                print("The player failed to load the video")

            default:
                print("Other status")
            }
        }
    } else {
        super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
    }

}
...