За первый вопрос
Вы можете обратиться к моему ответу на эту тему Потоковая передача триггера ios avplayer не заполнена
Для второго
Вот как я решил эту проблему:
Внутри, где вы обрабатываете событие для пустого буфера, добавьте этот код:
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;