11

AVQueuePlayerURL から読み込まれた一連のムービーを再生するために使用します。再生する必要が
あるすべての配列でプレーヤー インスタンスを初期化しようとしました。AVPlayerItems

player = [[AVQueuePlayer queuePlayerWithItems:playerItemsArray]

ただし、この場合、再生を開始する前AVQueuePlayerにそれぞれの最初の部分を読み込みます。AVPlayerItemイライラするフリーズが発生し、アプリケーションが数秒間応答しなくなります。

プレーヤーのキューに最初にのみ追加し、その状態を観察して、最初の項目が最後に到達したときにのみキューに 2 番目の項目を追加する可能性がありAVPLayerItemますが、この場合、2 番目の項目の初期化とバッファリングによって 2 つの項目の再生の間にギャップが生じますAVPlayerItem

フリーズせずに複数のビデオのギャップレス再生を整理する方法はありますか?
この目的のために他のプレーヤーを使用する必要がありますか?

前もって感謝します。

4

3 に答える 3

17

解決策が見つかりました。

AVPlayerItemプレーヤーのキューに新規追加するAVQueuePlayerと、プレーヤー アイテムの最初の部分がバッファリングされるまで同期的に待機します。

したがって、この場合、プレーヤー アイテムは非同期的にバッファリングされ、その後キューに追加されます。
を使用して行うことができます[AVURLAsset loadValuesAsynchronouslyForKeys: completionHandler:]

例えば:

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

[asset loadValuesAsynchronouslyForKeys:keys completionHandler:^()
{
    dispatch_async(dispatch_get_main_queue(), ^
    {
        AVPlayerItem *playerItem = [[[AVPlayerItem alloc] initWithAsset:asset] autorelease];         
        [player insertItem:playerItem afterItem:nil]; 
    });

}];

AVQueuePlayer のこのソリューション キューを使用すると、ギャップやフリーズなしでアイテムを取り込むことができます。

于 2013-03-04T13:16:44.923 に答える
2

Swift 2では、ここで作業しています:

func load() {
     let player = AVQueuePlayer()
     for url in urls {
        makeItem(url)
    }
}

func makeItem(url: String) {
    let avAsset = AVURLAsset(URL: NSURL(string: url)!)

    avAsset.loadValuesAsynchronouslyForKeys(["playable", "tracks", "duration"], completionHandler: {
        dispatch_async(dispatch_get_main_queue(), {
            self.enqueue(avAsset: avAsset)
        })
    })
}

func enqueue(avAsset: AVURLAsset) {
    let item = AVPlayerItem(asset: avAsset)
    self.player.insertItem(item, afterItem: nil)
}
于 2016-01-20T10:50:49.520 に答える
-1

これが解決策です。

- (void)_makePlayer{
     _player = [[AVQueuePlayer alloc] initWithPlayerItem:[AVPlayerItem playerItemWithAsset:[SSMoviePreviewItemMaker generateAVMovieItem]]];
}

+ (AVAsset *)generateAVMovieItem{
    NSArray * array = [SSMovieFileManager getAllMovieResourceURL];
    AVMutableComposition *composition = [[AVMutableComposition alloc] init];
    for (int i = 0; i < array.count; i++) {
        AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:array[i] options:nil];
        [composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration)
                             ofAsset:asset
                              atTime:composition.duration error:nil];

    }
   return composition;
}
于 2013-11-24T11:08:36.453 に答える