我正在创建一个应用程序,用户应该在其中录制自己的视频,同时在相机视图旁边的屏幕上播放另一个视频。结果将是两个视频文件、一个源和一个录制文件。使用 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
),但我不确定这是否适用于我的情况,我不明白如何继续。