1

AVQueuePlayerhls 再生を模倣するために、再生中に .aac チャンク (通常は 10 秒) を動的に追加しようとしていますAVPlayer

ただ、思い通りに曲を次々と再生してくれますが、曲間に200ms~400ms程度のギャップがあります。

次の質問には、この質問に対する答えがあるようですが、私にはうまくいきません。

ギャップやフリーズなしの 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ますか? それが唯一の解決策である場合、pcm を保持する NSData を にフィードするにはどうすればよいAVPlayerItemですか?

4

0 に答える 0