Беспрерывное воспроизведение AVQueuePlayer

Я пытаюсь динамически добавлять фрагменты .aac (обычно 10 секунд) во время воспроизведения в AVQueuePlayer, чтобы имитировать воспроизведение AVPlayer hls.

Однако он воспроизводит песни одну за другой, как я и хотел, между песнями есть промежуток от 200 до 400 мс.

следующий вопрос, кажется, имеет ответ на этот вопрос, но он не работает для меня.

Воспроизведение AVQueuePlayer без разрывов и зависаний

У меня есть одноэлементный проигрыватель и одноэлементный avplayeritem, чтобы отслеживать последний элемент. то с помощью следующего кода я могу успешно воспроизводить песни с пробелом.

 NSURL  *url = [NSURL URLWithString:[urlString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
    //NSData *urlData = [NSData dataWithContentsOfURL:url];

    GlobalPlayer *singleton=[GlobalPlayer sharedManager];
    //AVPlayerItem *item=[AVPlayerItem playerItemWithURL:url];

    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
    NSArray *keys = [NSArray arrayWithObject:@"playable"];

    if (singleton.lastItem==nil) {
        //initilize player
        //NSArray *playerArray=[[NSArray alloc] initWithObjects:item, nil];
        //singleton.globPlayer=[[AVQueuePlayer alloc] initWithItems:playerArray];
        //[singleton.globPlayer play];

        singleton.globPlayer=[[AVQueuePlayer alloc] init];
        singleton.lastItem=[AVPlayerItem alloc];

        __block AVPlayerItem *playerItem;
        [asset loadValuesAsynchronouslyForKeys:keys completionHandler:^()
         {
             dispatch_async(dispatch_get_main_queue(), ^
                            {
                                playerItem = [[AVPlayerItem alloc] initWithAsset:asset];
                                [singleton.globPlayer insertItem:playerItem afterItem:nil];
                                singleton.lastItem=playerItem;
                                [singleton.globPlayer play];
                            });

         }];

    }
    else
    {
        //[singleton.globPlayer insertItem:item afterItem:singleton.lastItem];
        __block AVPlayerItem *playerItem;
        [asset loadValuesAsynchronouslyForKeys:keys completionHandler:^()
        {
            dispatch_async(dispatch_get_main_queue(), ^
                           {
                               playerItem = [[AVPlayerItem alloc] initWithAsset:asset];
                               [singleton.globPlayer insertItem:playerItem afterItem:singleton.lastItem];
                                singleton.lastItem=playerItem;
                           });

        }];

    }

Должен ли я декодировать фрагменты, а затем передавать PCM на AVQueuePlayer? Если это единственное решение, как передать NSData, который содержит pcm, в AVPlayerItem?


person Mord Fustang    schedule 08.04.2015    source источник
comment
@matt Я бы не задавал этот вопрос, если бы он работал, не так ли? Должно быть что-то; поскольку AVPlayer может воспроизводить этот URL-адрес потока hls http://playlists.ihrhls.com/c5/1469/playlist.m3u8 без каких-либо проблем, между фрагментами .aac нет промежутков. Поэтому я вручную разбираю этот поток hls и добавляю фрагменты .acc в AVQueuePlayer, но между фрагментами возникает пробел. Мое первое предположение заключалось в том, что проблема заключалась в том, как он декодирует фрагменты или в том, как фрагменты кодируются, но я не уверен.   -  person Mord Fustang    schedule 08.04.2015
comment
Вы пробовали передавать файлы PCM напрямую в плеер? Если вы считаете, что декодирование является проблемой, сначала раскодируйте файлы, а затем отправьте их в очередь, конечно, если вы не возражаете против хлопот   -  person u.gen    schedule 09.04.2015