AVPlayer не передает потоковую дорожку в фоновом режиме - PullRequest
0 голосов
/ 23 февраля 2012

У меня проблема с AVPlayer, который не играет в фоновом режиме.

Вот подробности:

У меня есть объект AVPlayer и AVPlayerItem в качестве переменной экземпляра моего контроллера представления для потоковой передачи музыки по ссылкам, хранящимся в NSMutableArray, linkArray .Когда пользователь нажимает на трек на треке в UITableView, оба объекта создаются следующим образом:

musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:indexPath.row]]];
player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];

... И он воспроизводится отлично.Всякий раз, когда дорожка заканчивается, когда приложение активно , оно нормально пропускается, или когда я вручную запускаю приложение, чтобы пропустить дорожку (независимо от того, является ли оно активным или фоновым).Но, когда приложение находится в фоновом режиме (в том числе, когда устройство заблокировано), оно не будет воспроизводить следующую дорожку, когда оно пропускается.

Таким образом, оно самостоятельно переходит к следующей дорожке, но не воспроизводитсяЭто.Мне нужно либо снова активизировать приложение, либо запустить воспроизведение (через элементы управления наушниками или общесистемные элементы управления музыкой).

Вот код метода skipTrack, который вызывается как при ручном вызове, так исистема, когда песня достигает конца трека:

        if (nowPlaying == [linkArray count]-1) {
            nowPlaying = 0;
            musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:0]]];
            player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
        } else {
            NSLog(@"NowPlaying (before increment: %i", nowPlaying);
            //If not, increment nowPlaying by one and play
            nowPlaying++;
            NSLog(@"NowPlaying (after increment: %i", nowPlaying);
            musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:nowPlaying]]];
            player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
     }

Действительно надеюсь, что кто-то может помочь мне с

1 Ответ

2 голосов
/ 24 февраля 2012

Таким образом, проблема в том, что, поскольку вы включили приложение для воспроизведения звука в фоновом режиме, оно будет оставаться активным во время воспроизведения музыки. Как только музыка остановится, она будет приостановлена. Поэтому вам нужно запросить время для выполнения заданий в фоновом режиме , как только песня останавливается (у большинства проигрывателей есть функция обратного вызова, когда песня заканчивается, поместите этот код в начало). Итак, ваш код будет выглядеть примерно так ...

UIBackgroundTaskIdentifier newTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    // Clean up any unfinished task business by marking where you.
    // stopped or ending the task outright.
    [application endBackgroundTask:newTaskID];
    newTaskID = UIBackgroundTaskInvalid;
}];];

if (nowPlaying == [linkArray count]-1) {
        nowPlaying = 0;
        musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:0]]];
        player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
    } else {
        NSLog(@"NowPlaying (before increment: %i", nowPlaying);
        //If not, increment nowPlaying by one and play
        nowPlaying++;
        NSLog(@"NowPlaying (after increment: %i", nowPlaying);
        musicPlayerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[linkArray objectAtIndex:nowPlaying]]];
        player = [[AVPlayer alloc] initWithPlayerItem:musicPlayerItem];
 }

[[UIApplication sharedApplication] endBackgroundTask:newTaskID];
newTaskID = UIBackgroundTaskInvalid;'

Метод beginBackgroundTaskWithExpirationHandler: предоставит вам некоторое время для работы в фоновом режиме. Если ваше время заканчивается, блок кода, который был отправлен этому методу, выполняется. Вы должны включить это, если что-то идет не так, как надо, и вы должны очистить задачу. Подробнее об этом читайте в библиотеке разработчиков: здесь

...