19

オーディオ ストリームを再生するアプリを作成しています (webradio から)。

それに使っAVPlayerています。

  1. AVPlayer's接続が遅いとき、またはユーザーが「再生」をクリックしたときの「バッファリング」をどのように処理するかを知りたいです。AVPlayerを表示するための「バッファリング」を検出したいUIActivityIndicatorView

  2. バックグラウンドで実行中の同じ質問。この場合、バッファリングする場合はどうすればよいですか?

4

4 に答える 4

27

最初の質問について

このトピックに関する私の回答を参照できますios avplayer trigger streaming is out of buffer

第二に

これが私がこの同じ問題をどのように解決したかです:

バッファの空のイベントを処理する場所内に、次のコードを追加します。

    if (object == playerItem && [keyPath isEqualToString:@"playbackBufferEmpty"])
    {
        if (playerItem.playbackBufferEmpty) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"message" object:@"Buffering..."];
            
            if([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground)
            {
                task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
                }];
            }
        }
    }

バッファの準備が整ったら、このバックグラウンド タスクを停止する必要があります。

if (object == playerItem && [keyPath isEqualToString:@"playbackLikelyToKeepUp"])
{
    if (playerItem.playbackLikelyToKeepUp)
    {
        [player play];
        
        if([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground)
        {
            [[UIApplication sharedApplication] endBackgroundTask:task];
            task = 0;
        }
    }
}

ps: タスクは .h ファイルで次のように宣言されていますUIBackgroundTaskIdentifier task;

于 2011-08-26T14:46:01.983 に答える
10

この問題の解決策を見つけました。

if (self.avPlayer.currentItem.playbackLikelyToKeepUp == NO) 
{
    // Show activity indicator
}
于 2011-07-02T09:13:09.840 に答える
0

これを試して:

AVPlayerItem* mPlayerItem;

if(context == AVPlayerDemoPlaybackViewControllerCurrentItemBufferEmptyContext) 
{
    if (object == self.mPlayerItem && [path isEqualToString:@"playbackBufferEmpty"]) 
    {
        if (self.mPlayerItem.playbackBufferEmpty)
        {
            playBufferEmpty = TRUE;
            [indicator startAnimating];
            [vidStreaminglabel setText:@"Buffering..."];
            [vidStreaminglabel setHidden:NO];
        }
    }
}

else if(context == AVPlayerDemoPlaybackViewControllerCurrentItemPlayBackBufferFullContext)
{
    if (object == mPlayerItem && [path isEqualToString:@"playbackBufferFull"]){
        if (self.mPlayerItem.playbackBufferFull) {
            [mPlayer play];
        }
    }
}

else if (context == AVPlayerDemoPlaybackViewControllerCurrentItemPlayBackLikelyToKeepUpContext)
{
    if (object == mPlayerItem && [path isEqualToString:@"playbackLikelyToKeepUp"])
    {
         if(self.mPlayerItem.playbackLikelyToKeepUp)
         {
             // Autoplay after buffer 
             if(!(mRestoreAfterScrubbingRate != 0.f || [self.mPlayer rate] != 0.f))
             {
                 if (self.presentingViewController) {
                     [mPlayer play];
                 }

                 playBufferEmpty = FALSE;
                 [indicator stopAnimating];
                 [vidStreaminglabel setHidden:YES];
             }
        }
    }
}
于 2015-09-24T09:04:51.113 に答える