Възпроизвеждане на видеоклипове в AVPlayer

Моето приложение в момента възпроизвежда 2 видеоклипа едновременно, функционално, но всички SO отговори, които съм виждал, използват много код ключ-стойност. Лошо/грешно ли е, ако изпълня само минимума, посочен по-долу?

viewdidload

 AVURLAsset *asset = [AVURLAsset assetWithURL:[NSURL URLWithString:firstVideo.videoURL]];
    AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset];
    self.player1 = [AVPlayer playerWithPlayerItem:item];
    [topPlayer setMovieToPlayer:self.player1];


    AVURLAsset *asset2 = [AVURLAsset assetWithURL:[NSURL URLWithString:secondVideo.videoURL]];
    AVPlayerItem *item2 = [AVPlayerItem playerItemWithAsset:asset2];
    self.player2 = [AVPlayer playerWithPlayerItem:item2];
    [bottomPlayer setMovieToPlayer:self.player2];

    ((AVPlayerLayer *)[self.topPlayer layer]).videoGravity = AVLayerVideoGravityResizeAspectFill;
    ((AVPlayerLayer *)[self.bottomPlayer layer]).videoGravity = AVLayerVideoGravityResizeAspectFill;
    [self.player1 play];
    [self.player2 play];

Горният код е всичко, което използвам за възпроизвеждане на видео и работи добре. Понякога има забавяне от ~1 s, как мога да изчакам, докато и двата видеоклипа са готови за възпроизвеждане, след което да ги пусна и двата?


person Josue Espinosa    schedule 28.10.2013    source източник


Отговори (1)


използвайте KVO, за да наблюдавате състоянието на играча и пускайте видеоклипове, когато състоянието и на двамата е готово.

[yourPlayerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:nil];

и в кво:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"status"]) {
        AVPlayerStatus status = [change[NSKeyValueChangeNewKey] integerValue];
        switch (status) {
            case AVPlayerStatusUnknown:
                //do something
                break;
            case AVPlayerStatusReadyToPlay:
            {
                //check which avplayer is ready, by check the parametric object isEqual:yourPlayerItem
                //use a bool value to record the ready status. after two bools are YES, then play the video
            }
                break;
            case AVPlayerStatusFailed:
            {
                AVPlayerItem *playerItem = (AVPlayerItem *)object;
                [self assetFailedToPrepareForPlayback:playerItem.error];
            }
                break;

        }
    }
}
person Jing    schedule 28.10.2013