1

在这里,我正在使用 AVFoundation 框架来录制视频,并且我尝试一次使用前后摄像头,但是如果前摄像头正常工作,后摄像头在第一帧就会冻结,反之亦然。可以捕获会话一次有多个对象.这是任何人都可以帮助我的代码。

- (void)viewDidLoad
 {

[super viewDidLoad];
self.view.frame = CGRectMake(0, 0, 320, 568);
self.view.backgroundColor = [UIColor clearColor];
ActiveIndicatorView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 250)];
ActiveIndicatorView.backgroundColor = [UIColor clearColor];
[self.view addSubview:ActiveIndicatorView];
ActiveIndicatorViewBack = [[UIView alloc]initWithFrame:CGRectMake(0, 290, 320, 250)];
ActiveIndicatorViewBack.backgroundColor = [UIColor greenColor];
[self.view addSubview:ActiveIndicatorViewBack];
tracksArray = [[NSMutableArray alloc]
               initWithCapacity:2];
[self startRecording];

}

 -(void)startRecording{

[self StartCameraTwo];//front camera
[self StartCamera];//back camera

 }
-(void)StartCamera{

// NSLog(@"Setting up capture session");
CaptureSessionBack = [[AVCaptureSession alloc] init];
//ADD VIDEO INPUT

AVCaptureDevice *VideoDeviceBack = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
 // VideoDeviceBack = [self frontCamera];

if (VideoDeviceBack)
{
    NSError *error;
    VideoInputDeviceBack = [AVCaptureDeviceInput deviceInputWithDevice:VideoDeviceBack error:&error];
    if (!error)
    {
        if ([CaptureSessionBack canAddInput:VideoInputDeviceBack])
            [CaptureSessionBack addInput:VideoInputDeviceBack];
        else
            NSLog(@"");
    }
    else
    {
        //NSLog(@"Couldn't create video input");
    }
}
else
{
}
AVCaptureDevice *audioCaptureDeviceBack = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
NSError *error = nil;
AVCaptureDeviceInput *audioInputBack = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDeviceBack error:&error];
if (audioInputBack)
{
    [CaptureSessionBack addInput:audioInputBack];
}
previewBack = [self videoPreviewWithFrameBack :ActiveIndicatorViewBack.bounds];
previewBack.backgroundColor = [UIColor grayColor];
[ActiveIndicatorViewBack addSubview:previewBack];
  // [preview addSubview:vie];
MovieFileOutputBack = [[AVCaptureMovieFileOutput alloc] init];
MovieFileOutputBack.minFreeDiskSpaceLimit = 1024 * 1024;                        //<<SET MIN FREE SPACE IN BYTES FOR RECORDING TO CONTINUE ON A VOLUME

if ([CaptureSessionBack canAddOutput:MovieFileOutputBack])
    [CaptureSessionBack addOutput:MovieFileOutputBack];

//SET THE CONNECTION PROPERTIES (output properties)
[self CameraSetOutputPropertiesBack];           //(We call a method as it also has to be done after changing camera)

//NSLog(@"Setting image quality");
[CaptureSessionBack setSessionPreset:AVCaptureSessionPreset640x480];
if ([CaptureSessionBack canSetSessionPreset:AVCaptureSessionPreset640x480]) {   //Check size based configs are supported before setting them
    [CaptureSessionBack setSessionPreset:AVCaptureSessionPreset640x480];


}

if ([VideoDeviceBack isFocusModeSupported:AVCaptureFocusModeAutoFocus] && [VideoDeviceBack lockForConfiguration:&error]){
    [VideoDeviceBack setFocusMode:AVCaptureFocusModeAutoFocus];
    if ([VideoDeviceBack isFocusPointOfInterestSupported])
        [VideoDeviceBack setFocusPointOfInterest:CGPointMake(0.5f,0.5f)];
    [VideoDeviceBack unlockForConfiguration];
}

[CaptureSessionBack startRunning];

}
-(void)StartCameraTwo{
// NSLog(@"Setting up capture session");
CaptureSession = [[AVCaptureSession alloc] init];
//ADD VIDEO INPUT

AVCaptureDevice *VideoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
VideoDevice = [self frontCamera];

if (VideoDevice)
{
    NSError *error;
    VideoInputDevice = [AVCaptureDeviceInput deviceInputWithDevice:VideoDevice error:&error];
    if (!error)
    {
        if ([CaptureSession canAddInput:VideoInputDevice])
            [CaptureSession addInput:VideoInputDevice];
        else
            NSLog(@"");
    }
    else
    {
        //NSLog(@"Couldn't create video input");
    }
}
else
{

}

AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
NSError *error = nil;
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error];
if (audioInput)
{
    [CaptureSession addInput:audioInput];
}

preview = [self videoPreviewWithFrame:ActiveIndicatorView.bounds];
ActiveIndicatorView.backgroundColor = [UIColor redColor];
[ActiveIndicatorView addSubview:preview];
MovieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
MovieFileOutput.minFreeDiskSpaceLimit = 1024 * 1024;                        //<<SET MIN FREE SPACE IN BYTES FOR RECORDING TO CONTINUE ON A VOLUME

if ([CaptureSession canAddOutput:MovieFileOutput])
    [CaptureSession addOutput:MovieFileOutput];

//SET THE CONNECTION PROPERTIES (output properties)
[self CameraSetOutputProperties];           //(We call a method as it also has to be done after changing camera)

//NSLog(@"Setting image quality");
[CaptureSession setSessionPreset:AVCaptureSessionPreset640x480];
if ([CaptureSession canSetSessionPreset:AVCaptureSessionPreset640x480]) {   //Check size based configs are supported before setting them
    [CaptureSession setSessionPreset:AVCaptureSessionPreset640x480];


}

if ([VideoDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus] && [VideoDevice lockForConfiguration:&error]){
    [VideoDevice setFocusMode:AVCaptureFocusModeAutoFocus];
    if ([VideoDevice isFocusPointOfInterestSupported])
        [VideoDevice setFocusPointOfInterest:CGPointMake(0.5f,0.5f)];
    [VideoDevice unlockForConfiguration];
}

[CaptureSession startRunning];
}

- (void) CameraSetOutputProperties
{
//SET THE CONNECTION PROPERTIES (output properties)
CaptureConnection = [MovieFileOutput connectionWithMediaType:AVMediaTypeVideo];

//Set landscape (if required)
if ([CaptureConnection isVideoOrientationSupported])
{
    AVCaptureVideoOrientation orientation = AVCaptureVideoOrientationLandscapeLeft;     //<<<<<SET VIDEO ORIENTATION IF LANDSCAPE
    [CaptureConnection setVideoOrientation:orientation];

}

//Set frame rate (if requried)
CMTimeShow(CaptureConnection.videoMinFrameDuration);
CMTimeShow(CaptureConnection.videoMaxFrameDuration);

if (CaptureConnection.supportsVideoMinFrameDuration)
    CaptureConnection.videoMinFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);
if (CaptureConnection.supportsVideoMaxFrameDuration)
    CaptureConnection.videoMaxFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);

CMTimeShow(CaptureConnection.videoMinFrameDuration);
CMTimeShow(CaptureConnection.videoMaxFrameDuration);
 }

  - (void) CameraSetOutputPropertiesBack
  {
//SET THE CONNECTION PROPERTIES (output properties)
CaptureConnectionBack = [MovieFileOutputBack connectionWithMediaType:AVMediaTypeVideo];

//Set landscape (if required)
if ([CaptureConnectionBack isVideoOrientationSupported])
{
    AVCaptureVideoOrientation orientation = AVCaptureVideoOrientationLandscapeLeft;     //<<<<<SET VIDEO ORIENTATION IF LANDSCAPE
    [CaptureConnectionBack setVideoOrientation:orientation];

}

//Set frame rate (if requried)
CMTimeShow(CaptureConnectionBack.videoMinFrameDuration);
CMTimeShow(CaptureConnectionBack.videoMaxFrameDuration);

if (CaptureConnectionBack.supportsVideoMinFrameDuration)
    CaptureConnectionBack.videoMinFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);
if (CaptureConnectionBack.supportsVideoMaxFrameDuration)
    CaptureConnectionBack.videoMaxFrameDuration = CMTimeMake(1, CAPTURE_FRAMES_PER_SECOND);

CMTimeShow(CaptureConnectionBack.videoMinFrameDuration);
CMTimeShow(CaptureConnectionBack.videoMaxFrameDuration);
 }
 - (AVCaptureDevice *)frontCamera {
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices) {
    if ([device position] == AVCaptureDevicePositionFront) {
        return device;
    }
}
return nil;
  }
4

1 回答 1

0

目前无法同时使用前置和后置摄像头。

于 2013-08-28T20:10:09.873 回答