同步录制/播放ios

同步录制/播放ios,ios,cocoa,synchronization,avfoundation,avplayer,Ios,Cocoa,Synchronization,Avfoundation,Avplayer,我正在创建一个应用程序,当另一个视频在摄像机视图旁边的屏幕上播放时,用户应该自己录制视频。结果将是两个视频文件、一个源和一个录制。使用AVCaptureSession等,我成功地在屏幕上播放另一个视频的同时录制了一个视频。问题是它并不完全同步 我现在就是这样设置的: -(void)playAndRecordInSync //Session is already set etc. { player = [AVPlayer playerWithURL:url]; pl

我正在创建一个应用程序,当另一个视频在摄像机视图旁边的屏幕上播放时,用户应该自己录制视频。结果将是两个视频文件、一个源和一个录制。使用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];
}
结果是两个视频,但第二个(录制的)视频略长于源/原始视频。当播放它们时(在同一时间),则视频编号2有将近半秒的延迟。感觉video2开始录制的时间太早了,因为有“额外”的时间。也可能是播放开始得太晚。不管怎样,我都不知道如何在此基础上保持一致性。我可能会经常玩睡眠等游戏,但这只适用于我的手机,因为这与手机的速度有关。 即使对于
AVPlayer
,存在类似
-(void)willStartPlaying
的委托方法(我认为没有),同步仍然会有问题,因为在返回之前会有一个小的等待。有办法同时发出两个命令吗?还是有其他解决办法

编辑


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

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