AVQueuePlayer воспроизводит несколько звуковых дорожек в фоновом режиме iOS5

Я использовал AVQueuePlayer для воспроизведения нескольких элементов в фоновом режиме. И код отлично работал в iOS4. А в iOS5 AVQueuePlayer изменил свое поведение, поэтому проигрыватель прекращает воспроизведение после завершения первого элемента.

Мэтт Галлахер написал подсказку в этом сообщении. «Похоже, что в iOS 5 AVQueuePlayer больше не выполняет предварительную буферизацию. В iOS 4 он выполнял предварительную буферизацию следующего трека».

Итак, мой вопрос заключается в том, как воспроизвести несколько элементов в фоновом режиме с помощью AVPlayer или AVQueuePlayer в iOS5.


person mashe    schedule 20.11.2011    source источник


Ответы (1)


Ответ Мэтта Галлахера в его блоге: "Вы должны соблюдать текущий элемент в AVQueuePlayer. Когда он изменится, вы должны использовать UIApplication для запуска backgroundTask и завершить фоновую задачу только тогда, когда получите уведомление о готовности к воспроизведению для следующего файла».

На самом деле мне это не помогло.

Итак, мое решение:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

Я не могу объяснить почему, но эта строка кода перед добавлением нового AVPlayerItem заставила мой код работать. Также для тех, кто добавляет следующий трек в фоновом режиме и использует метод

- (void)loadValuesAsynchronouslyForKeys:(NSArray *)keys completionHandler:(void (^)(void))handler;

Вы должны добавить AVPlayerItem в player в основном потоке. нравится:

- (void)addAsset:(AVAsset*)as
{
    [player insertItem:[AVPlayerItem playerItemWithAsset:as] afterItem:[player currentItem]];
}

.........

//adding new track 

AVURLAsset* as = [[self createAsset:urlString] retain];
NSArray *keys = [NSArray arrayWithObject:@"tracks"];
[as loadValuesAsynchronouslyForKeys:keys completionHandler:^(void) {
NSError *error = 
AVKeyValueStatus trackStatus = [as statusOfValueForKey:@"tracks" error:&error];
switch (trackStatus) {
    case AVKeyValueStatusLoaded:
            [self performSelectorOnMainThread:@selector(addAsset:) withObject:as waitUntilDone:YES];
            [as release];
    break;
    case AVKeyValueStatusFailed:
            [as release];
    break;
    case AVKeyValueStatusCancelled:
            [as release];
    break;
    default:
    break;
    }

}];

ОБНОВЛЕНИЕ: Мэтт Галлахер был прав, но это работает, только если вы не используете асинхронную загрузку.

person mashe    schedule 21.11.2011