同步录制/播放 iOS

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];
}

这样做的结果是两个视频,但第二个(录制的)视频比源/原始视频略长。当它们在彼此上方播放时,第二个视频有近半秒的延迟。感觉视频2开始录制得太早了,因为有“额外”的时间。也可能是播放开始太晚了。无论哪种方式,我不知道如何基于这个实现一致性。我可能可以玩很多睡眠等等,但这只适用于我的手机,因为这与手机速度有关。即使像AVPlayer这样的委托方法-(void)willStartPlaying存在,我认为并没有,由于有一个小的等待时间,同步仍然存在问题。是否有一种方法可以同时触发两个命令?还是有其他解决方案?
编辑
我一直在阅读这个AVSynchronizedLayer),但我不确定这是否适用于我的情况,而且我不知道该怎么做。
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接