切换摄像机后音频/视频不同步

问题描述 投票:7回答:3

我尝试创建一个应用程序,在录制过程中,我可以在该设备上录制来自设备上不同摄像机的视频。例如。用户从前置摄像头按下“开始录制”按钮,录制5秒后,用户按下“切换摄像头”按钮,应用程序将视频源从前置摄像头切换到后置摄像头,并继续录制。对于摄像机切换,我使用下一个代码:

NSError *error;
AVCaptureDeviceInput *newVideoInput;
AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position];

if (currentCameraPosition == AVCaptureDevicePositionBack)
{
    currentCameraPosition = AVCaptureDevicePositionFront;
}
else
{
    currentCameraPosition = AVCaptureDevicePositionBack;
}

AVCaptureDevice *backFacingCamera = nil;
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices) 
{
    if ([device position] == currentCameraPosition)
    {
        backFacingCamera = device;
    }
}
newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:backFacingCamera error:&error];

if (newVideoInput != nil)
{
    [_captureSession beginConfiguration];

    [_captureSession removeInput:videoInput];
    if ([_captureSession canAddInput:newVideoInput])
    {
        [_captureSession addInput:newVideoInput];
        videoInput = newVideoInput;
    }
    else
    {
        [_captureSession addInput:videoInput];
    }
    //captureSession.sessionPreset = oriPreset;
    [_captureSession commitConfiguration];
}

_inputCamera = backFacingCamera;

此应用更改了视频源并继续写,但是...音频/视频不同步...有人可以帮我解决这个问题吗?

谢谢。

ios xcode avcapturesession
3个回答
1
投票

您需要停止录制,切换并重新启动。相机开关不是瞬间AFAIK

不能录制到n个文件中,以后再将它们粘贴在一起?

尝试使用各个AVMutableComposition轨道,然后为音频设置可变的组合,为视频设置可变的组合。(请参阅Merging two m4v Movie Files Using AVMutableComposition - Videos Will Not Merge


0
投票

切换摄像机时,您需要在委托方法中暂停缓冲区写入:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

您可以签出开源项目PBJVision


0
投票

我遇到了同样的问题,尝试了很多尝试,并提出了一个简单便捷的解决方案,该解决方案不会出现任何故障。

enter image description here

问题是,如@ daij-djan所指出的,切换会话输入会花费一些时间,并在输出中添加一些黑色帧,然后继续发送帧,就像永不停止一样。据我所知,不可能知道影响了多少帧。会话时间码不受此延迟的影响,因此我们不能使用它来忽略某些视频帧。

enter image description here

与使用多个摄像机输入进行一个会话不同,每个摄像机输入可以具有一个会话(如果需要,可以有一个会话用于音频),而可以输出一个视频。然后,您只需要在会话之间切换此输出。

enter image description here

结果,您将不会失去同步,也不会做任何丑陋的事情。在我的测试中,对内存的影响非常有限,并且我没有注意到任何性能影响。我的理论是,只有在连接了输出之后,会话才处于活动状态。

可以像这样完成输出切换:

fromSession.beginConfiguration()
fromSession.removeOutput(videoOutput)
fromSession.commitConfiguration()

toSession.beginConfiguration()
if toSession.canAddOutput(videoOutput) { toSession.addOutput(videoOutput) }
toSession.commitConfiguration()
© www.soinside.com 2019 - 2024. All rights reserved.