同步录制/播放ios

时间:2013-08-13 20:45:08

标签: ios cocoa synchronization avfoundation avplayer

我正在创建一个应用程序,其中用户应该视频录制自己,而另一个视频正在相机视图旁边的屏幕上播放。结果将是两个视频文件,一个源和一个录制。使用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)willStartPlayingAVPlayer的委托方法,我认为不存在,但同步仍然存在问题,因为返回时会有一些小的等待。有没有办法一次触发两个命令?或者还有其他解决方案吗?

修改

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

1 个答案:

答案 0 :(得分:1)

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