AVQueuePlayer无缝播放

时间:2015-04-08 13:59:09

标签: ios objective-c audio avqueueplayer avplayeritem

我正在尝试在播放期间动态添加.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

0 个答案:

没有答案