3

我正在创建一个应用程序,用户应该在其中录制自己的视频,同时在相机视图旁边的屏幕上播放另一个视频。结果将是两个视频文件、一个源和一个录制文件。使用 AVCaptureSession 等,我成功地录制了一个视频,同时另一个视频正在屏幕上播放。问题是它并不完全同步。

这就是我现在设置的方式:

-(void)playAndRecordInSync //Session is already set etc.
{
        player = [AVPlayer playerWithURL:url];
        playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
        [playerLayer setFrame:leftCameraView.bounds];
        [playerLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
        [leftCameraView.layer addSublayer:playerLayer];

        //Will stop recording camera when source video reaches end(notification):
        player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
        [[NSNotificationCenter defaultCenter] addObserver:self
                              selector:@selector(playerItemDidReachEnd:)
                               name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:[player currentItem]];
        //Start playback:
        [player play]; 
        //Start recording:
        [movieOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
}
- (void)playerItemDidReachEnd:(NSNotification *)notification {
    [movieOutput stopRecording];
}

结果是两个视频,但第二个(录制的)视频比源/原始视频稍长。当它们相互叠加播放时(同时),然后播放视频 nr。2 有将近半秒的延迟。由于“额外”的时间,感觉 video2 已经开始录制得太早了。也可能是播放开始得太晚了。无论哪种方式,我都不知道如何在此基础上做出任何一致性。我可能可以在睡眠等方面玩很多,但这仅适用于我的手机,因为这与手机的速度有关。即使有像这样的委托-(void)willStartPlaying方法AVPlayer,我认为不存在,同步仍然会有问题,因为在返回之前有一个小的等待。有没有办法一次触发两个命令?或者有其他解决方案吗?

编辑

我一直在阅读这个AVSynchronizedLayer),但我不确定这是否适用于我的情况,我不明白如何继续。

4

1 回答 1

1

我发现延迟总是由于播放开始太晚造成的,但是录制和播放同时停止,所以我通过查找解决了这个问题v2.duration - v1.duration,并从 v2 的开头减去结果,使用AVAssetExportSession. 现在在不同的图层中同时播放两个视频时,启动两个视频仍有一些延迟,但通过导出视频,我已经确认它们的长度相同并且现在同步。

于 2013-08-18T15:43:55.717 回答