Obsługa streamingu zdarzeń za pomocą AVPlayer
Buduję aplikację, która odtwarza strumień audio (z webradio).
Używam do tegoAVPlayer
.
1) chciałbym wiedzieć, jak radzisz sobie z AVPlayer's
"buforowaniem", gdy połączenie jest wolne lub gdy użytkownik po prostu kliknął "play". Chcę wykryć, że AVPlayer
jest "buforowanie", aby wyświetlić UIActivityIndicatorView
.
2) to samo pytanie podczas uruchamiania w tle. Co powinienem zrobić, jeśli buforowanie w tym przypadku?
Dzięki !4 answers
Na pierwsze pytanie
Możesz odnieść się do mojej odpowiedzi na ten temat iOS avplayer trigger streaming jest poza buforem
Na drugi
Oto jak rozwiązałem ten sam problem:
Wewnątrz gdzie obsługujesz Zdarzenie dla bufora pustego dodaj ten kod:
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) {
}];
}
}
}
Teraz będziesz musiał zatrzymać to zadanie w tle, gdy twój bufor będzie gotowy do ponownego uruchomienia:
if (object == playerItem && [keyPath isEqualToString:@"playbackLikelyToKeepUp"])
{
if (playerItem.playbackLikelyToKeepUp)
{
[player play];
if([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground)
{
[[UIApplication sharedApplication] endBackgroundTask:task];
task = 0;
}
}
}
Ps: zadanie jest zadeklarowane na moim .plik h jako UIBackgroundTaskIdentifier task;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:18
Znalazłem rozwiązanie tego problemu.
if (self.avPlayer.currentItem.playbackLikelyToKeepUp == NO)
{
// Show activity indicator
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-26 19:08:38
Dla Swift 3
To działa dobrze dla mnie, może to pomoże, zadzwoń self?.bufferState()
wewnątrz addPeriodicTimeObserver
private func bufferState() {
if let currentItem = self.avPlayer.currentItem {
if currentItem.status == AVPlayerItemStatus.readyToPlay {
if currentItem.isPlaybackLikelyToKeepUp {
print("Playing ")
} else if currentItem.isPlaybackBufferEmpty {
print("Buffer empty - show loader")
} else if currentItem.isPlaybackBufferFull {
print("Buffer full - hide loader")
} else {
print("Buffering ")
}
} else if currentItem.status == AVPlayerItemStatus.failed {
print("Failed ")
} else if currentItem.status == AVPlayerItemStatus.unknown {
print("Unknown ")
}
} else {
print("avPlayer.currentItem is nil")
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 16:32:44
Spróbuj tego:
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];
}
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-24 09:04:51