录制video时更换相机捕捉设备

我正在开发一个iPhone应用程序。 在此,要求暂停和恢复摄像机。 所以我使用AVFoundation而不是使用UIImagePickerController

我的代码是:

  - (void) startup :(BOOL)isFrontCamera { if (_session == nil) { NSLog(@"Starting up server"); self.isCapturing = NO; self.isPaused = NO; _currentFile = 0; _discont = NO; // create capture device with video input _session = [[AVCaptureSession alloc] init]; AVCaptureDevice *cameraDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if(isFrontCamera) { NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; AVCaptureDevice *captureDevice = nil; for (AVCaptureDevice *device in videoDevices) { if (device.position == AVCaptureDevicePositionFront) { captureDevice = device; break; } } cameraDevice = captureDevice; } cameraDevice=[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput* input = [AVCaptureDeviceInput deviceInputWithDevice:cameraDevice error:nil]; [_session addInput:input]; // audio input from default mic AVCaptureDevice* mic = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; AVCaptureDeviceInput* micinput = [AVCaptureDeviceInput deviceInputWithDevice:mic error:nil]; [_session addInput:micinput]; // create an output for YUV output with self as delegate _captureQueue = dispatch_queue_create("uk.co.gdcl.cameraengine.capture", DISPATCH_QUEUE_SERIAL); AVCaptureVideoDataOutput* videoout = [[AVCaptureVideoDataOutput alloc] init]; [videoout setSampleBufferDelegate:self queue:_captureQueue]; NSDictionary* setcapSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange], kCVPixelBufferPixelFormatTypeKey, nil]; videoout.videoSettings = setcapSettings; [_session addOutput:videoout]; _videoConnection = [videoout connectionWithMediaType:AVMediaTypeVideo]; [_videoConnection setVideoOrientation:AVCaptureVideoOrientationPortrait]; NSDictionary* actual = videoout.videoSettings; _cy = [[actual objectForKey:@"Width"] integerValue]; _cx = [[actual objectForKey:@"Height"] integerValue]; AVCaptureAudioDataOutput* audioout = [[AVCaptureAudioDataOutput alloc] init]; [audioout setSampleBufferDelegate:self queue:_captureQueue]; [_session addOutput:audioout]; _audioConnection = [audioout connectionWithMediaType:AVMediaTypeAudio]; [_session startRunning]; _preview = [AVCaptureVideoPreviewLayer layerWithSession:_session]; _preview.videoGravity = AVLayerVideoGravityResizeAspectFill; } } 

在这里,当我将相机更改为Front时,我正面临着这个问题。 当我通过将相机更改为前面来调用上述方法时,预览图层将卡住,无法预览。 我的疑问是“我们可以在捕获过程中更换捕获设备吗?”。 请指导我在哪里出错(或)build议我如何在录制时在前后相机之间导航的解决scheme。

提前致谢。

是的你可以。 有几件事情你需要迎合。

  1. 需要使用AVCaptureVideoDataOutput及其代表进行录制。
  2. 确保在添加新的deviceInput之前删除以前的deviceInput。
  3. 您也必须删除并重新创buildAVCaptureVideoDataOutput。

我现在正在使用这两个函数,它会在会话运行时工作。

 - (void)configureVideoWithDevice:(AVCaptureDevice *)camera { [_session beginConfiguration]; [_session removeInput:_videoInputDevice]; _videoInputDevice = nil; _videoInputDevice = [AVCaptureDeviceInput deviceInputWithDevice:camera error:nil]; if ([_session canAddInput:_videoInputDevice]) { [_session addInput:_videoInputDevice]; } [_session removeOutput:_videoDataOutput]; _videoDataOutput = nil; _videoDataOutput = [[AVCaptureVideoDataOutput alloc] init]; [_videoDataOutput setSampleBufferDelegate:self queue:_outputQueueVideo]; NSDictionary* setcapSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange], kCVPixelBufferPixelFormatTypeKey, nil]; _videoDataOutput.videoSettings = setcapSettings; [_session addOutput:_videoDataOutput]; _videoConnection = [_videoDataOutput connectionWithMediaType:AVMediaTypeVideo]; if([_videoConnection isVideoOrientationSupported]) { [_videoConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeRight]; } [_session commitConfiguration]; } - (void)configureAudioWithDevice:(AVCaptureDevice *)microphone { [_session beginConfiguration]; _audioInputDevice = [AVCaptureDeviceInput deviceInputWithDevice:microphone error:nil]; if ([_session canAddInput:_audioInputDevice]) { [_session addInput:_audioInputDevice]; } [_session removeOutput:_audioDataOutput]; _audioDataOutput = nil; _audioDataOutput = [[AVCaptureAudioDataOutput alloc] init]; [_audioDataOutput setSampleBufferDelegate:self queue:_outputQueueAudio]; [_session addOutput:_audioDataOutput]; _audioConnection = [_audioDataOutput connectionWithMediaType:AVMediaTypeAudio]; [_session commitConfiguration]; } 

您不能在会话中更改captureDevice。 一次只能运行一个捕获会话。 您可以结束当前会话并创build一个新会话。 会有一点点滞后(可能是一两秒,取决于你的CPU负载)。

我希望苹果会允许多个会话或每个会话至less多个设备…但他们不… …。

你有没有考虑过多个会议,然后处理video文件,把它们合并为一个?