我正在尝试创建应用程序,我可以在录制期间在设备上录制来自不同摄像机的视频。 例如。用户按下前置摄像头的“开始记录”按钮,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;
此应用程序更改视频源并继续写入,但...音频/视频不同步... 有人能解决这个问题吗?
谢谢。
答案 0 :(得分:1)
您需要停止录制,切换并重新启动它。 相机开关不是即时AFAIK
你不能录制成n个文件,然后把它们放在一起吗?
尝试使用单独的AVMutableComposition轨道,然后为音频和视频设置一个mutablecomposition。 (见Merging two m4v Movie Files Using AVMutableComposition - Videos Will Not Merge)
答案 1 :(得分:0)
切换摄像机时,需要在委托方法中暂停缓冲区写入:
/home
您可以查看开源项目PBJVision
答案 2 :(得分:0)
我遇到了同样的问题,尝试了很多尝试,并提出了一个简单便捷的解决方案,该解决方案不会出现任何故障。
问题是,正如@ daij-djan指出的那样,切换会话输入会花费一些时间,并在输出中添加一些黑帧,然后继续发送帧,就像永不停止一样。据我所知,不可能知道影响了多少帧。会话时间码不受此延迟的影响,因此我们不能使用它来忽略某些视频帧。
与一个摄像机具有多个摄像机输入的会话不同,每个摄像机输入可以具有一个会话(如果需要,可以有一个会话用于音频)和一个视频输出。然后,您只需要在会话之间切换此输出即可。
结果,您将不会出现任何不同步和丑陋的事情。 在我的测试中,对内存的影响非常有限,并且我没有注意到任何性能影响。我的理论是,只有在连接了输出之后,会话才处于活动状态。