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

时间:2012-12-19 11:15:38

标签: ios xcode avcapturesession

我正在尝试创建应用程序,我可以在录制期间在设备上录制来自不同摄像机的视频。 例如。用户按下前置摄像头的“开始记录”按钮,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;

此应用程序更改视频源并继续写入,但...音频/视频不同步... 有人能解决这个问题吗?

谢谢。

3 个答案:

答案 0 :(得分:1)

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

你不能录制成n个文件,然后把它们放在一起吗?

尝试使用单独的AVMutableComposition轨道,然后为音频和视频设置一个mutablecomposition。 (见Merging two m4v Movie Files Using AVMutableComposition - Videos Will Not Merge

答案 1 :(得分:0)

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

/home

您可以查看开源项目PBJVision

答案 2 :(得分:0)

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

enter image description here

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

enter image description here

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

enter image description here

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