我试图在播放期间动态添加.aac块(通常为10秒)到 AVQueuePlayer 以模仿 AVPlayer hls播放 .

然而,它按照我的意愿一个接一个地播放歌曲,歌曲之间有大约200ms到400ms的差距 .

以下问题似乎对这个问题有答案,但它对我不起作用 .

AVQueuePlayer playback without gap and freeze

我有一个单身人士和一个单身 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 ?如果这是唯一的解决方案,我如何将保持pcm的NSData提供给 AVPlayerItem