オーディオ ストリームを再生するアプリを作成しています (webradio から)。
それに使っAVPlayer
ています。
AVPlayer's
接続が遅いとき、またはユーザーが「再生」をクリックしたときの「バッファリング」をどのように処理するかを知りたいです。AVPlayer
を表示するための「バッファリング」を検出したいUIActivityIndicatorView
。バックグラウンドで実行中の同じ質問。この場合、バッファリングする場合はどうすればよいですか?
オーディオ ストリームを再生するアプリを作成しています (webradio から)。
それに使っAVPlayer
ています。
AVPlayer's
接続が遅いとき、またはユーザーが「再生」をクリックしたときの「バッファリング」をどのように処理するかを知りたいです。AVPlayer
を表示するための「バッファリング」を検出したいUIActivityIndicatorView
。
バックグラウンドで実行中の同じ質問。この場合、バッファリングする場合はどうすればよいですか?
このトピックに関する私の回答を参照できます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;
この問題の解決策を見つけました。
if (self.avPlayer.currentItem.playbackLikelyToKeepUp == NO)
{
// Show activity indicator
}
これを試して:
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];
}
}
}
}