代码之家  ›  专栏  ›  技术社区  ›  Charles Yao

如何在播放同一本地视频时同步多个AVPlayer

  •  2
  • Charles Yao  · 技术社区  · 7 年前

    我必须同时用AVPlayer播放同一个本地视频文件,我创建了4个AVPlayer实例,AVPlayerLayers被添加到同一层。但问题是,4名球员不是同时开始比赛的。如何让它们同时开始?这是我的代码:

    self.players = @[].mutableCopy;
        CMAudioClockCreate(kCFAllocatorDefault, &_syncClock);
        AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:self.url];
        for (NSInteger i = 0; i<playerNum; i++) {
            AVPlayer *avPlayer = [AVPlayer playerWithPlayerItem:item.copy];
            AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
            //设置模式
            playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
            playerLayer.contentsScale = [UIScreen mainScreen].scale;
            CGPoint pos = [playerOriginArr[i] CGPointValue];
            playerLayer.frame = CGRectMake(pos.x, pos.y, playerSize.width, playerSize.height);
            [self.playBackBgView.layer addSublayer:playerLayer];
            avPlayer.masterClock = _syncClock;
            [avPlayer.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
            [avPlayer play];
            [self.players addObject:avPlayer];
        }
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"status"] && [object isKindOfClass:[AVPlayerItem class]]) {
        AVPlayerItem *playerItem = (AVPlayerItem *)object;
        if (playerItem.status == AVPlayerStatusReadyToPlay) {
            for (AVPlayer *player in self.players) {
                if (player.currentItem == playerItem) {
                    [player prerollAtRate:1.0 completionHandler:^(BOOL finished) {
                        if (finished) {
                        }
                    }];
                    player.automaticallyWaitsToMinimizeStalling = NO;//如果是
                    NSLog(@"setRate");
                    [player setRate:1.0 time:kCMTimeInvalid atHostTime:CMClockGetTime(_syncClock)];
                }
            }
        }
    }
    

    }

    1 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Childs    7 年前

    只创建一个 AVPlayer 并创建多个 AVPlayerLayer 从那开始。

    层将同步。