2

我正在使用AVCaptureSession 录制视频,同时我正在使用STTgoogle Speech to text api)将语音转换为文本。当我单击说话按钮然后相机冻结时,我遇到了问题。任何正确的答案都是可以接受的。提前致谢 。

启动相机

-(void)viewDidLoad;

     if ([[self captureManager] setupSession]) {
            // Create video preview layer and add it to the UI
            AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[[self captureManager] session]];
            UIView *view = [self videoPreviewView];
            CALayer *viewLayer = [view layer];
            [viewLayer setMasksToBounds:YES];

            CGRect bounds = [view bounds];
            [newCaptureVideoPreviewLayer setFrame:bounds];

            if ([newCaptureVideoPreviewLayer isOrientationSupported]) {
                [newCaptureVideoPreviewLayer setOrientation:AVCaptureVideoOrientationLandscapeLeft|AVCaptureVideoOrientationLandscapeRight];
            }

            [newCaptureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

            [viewLayer insertSublayer:newCaptureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]];

            [self setCaptureVideoPreviewLayer:newCaptureVideoPreviewLayer];
            [newCaptureVideoPreviewLayer release];

            // Start the session. This is done asychronously since -startRunning doesn't return until the session is running.
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                [[[self captureManager] session] startRunning];
            });

            [self updateButtonStates];
    }



       - (BOOL) setupSession
  {
      BOOL success = NO;

        // Set torch and flash mode to auto
     if ([[self backFacingCamera] hasFlash]) {
    if ([[self backFacingCamera] lockForConfiguration:nil]) {
        if ([[self backFacingCamera]       isFlashModeSupported:AVCaptureFlashModeAuto]) {
            [[self backFacingCamera] setFlashMode:AVCaptureFlashModeAuto];
        }
        [[self backFacingCamera] unlockForConfiguration];
    }
}
   if ([[self backFacingCamera] hasTorch]) {
    if ([[self backFacingCamera] lockForConfiguration:nil]) {
        if ([[self backFacingCamera] isTorchModeSupported:AVCaptureTorchModeAuto]) {
            [[self backFacingCamera] setTorchMode:AVCaptureTorchModeAuto];
        }
        [[self backFacingCamera] unlockForConfiguration];
    }
}

// Init the device inputs
   AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc]  initWithDevice:[self frontFacingCamera] error:nil];
AVCaptureDeviceInput *newAudioInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self audioDevice] error:nil];


// Setup the still image file output
AVCaptureStillImageOutput *newStillImageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
                                AVVideoCodecJPEG, AVVideoCodecKey,
                                nil];
[newStillImageOutput setOutputSettings:outputSettings];
[outputSettings release];


// Create session (use default AVCaptureSessionPresetHigh)
AVCaptureSession *newCaptureSession = [[AVCaptureSession alloc] init];


// Add inputs and output to the capture session
if ([newCaptureSession canAddInput:newVideoInput]) {
    [newCaptureSession addInput:newVideoInput];
}
if ([newCaptureSession canAddInput:newAudioInput]) {
    [newCaptureSession addInput:newAudioInput];
}
if ([newCaptureSession canAddOutput:newStillImageOutput]) {
    [newCaptureSession addOutput:newStillImageOutput];
}

[self setStillImageOutput:newStillImageOutput];
[self setVideoInput:newVideoInput];
[self setAudioInput:newAudioInput];
[self setSession:newCaptureSession];

[newStillImageOutput release];
[newVideoInput release];
[newAudioInput release];
[newCaptureSession release];

// Set up the movie file output
NSURL *outputFileURL = [self tempFileURL];
AVCamRecorder *newRecorder = [[AVCamRecorder alloc] initWithSession:[self session] outputFileURL:outputFileURL];
[newRecorder setDelegate:self];

// Send an error to the delegate if video recording is unavailable
if (![newRecorder recordsVideo] && [newRecorder recordsAudio]) {
    NSString *localizedDescription = NSLocalizedString(@"Video recording unavailable", @"Video recording unavailable description");
    NSString *localizedFailureReason = NSLocalizedString(@"Movies recorded on this device will only contain audio. They will be accessible through iTunes file sharing.", @"Video recording unavailable failure reason");
    NSDictionary *errorDict = [NSDictionary dictionaryWithObjectsAndKeys:
                               localizedDescription, NSLocalizedDescriptionKey, 
                               localizedFailureReason, NSLocalizedFailureReasonErrorKey, 
                               nil];
    NSError *noVideoError = [NSError errorWithDomain:@"AVCam" code:0 userInfo:errorDict];
    if ([[self delegate] respondsToSelector:@selector(captureManager:didFailWithError:)]) {
        [[self delegate] captureManager:self didFailWithError:noVideoError];
    }
}

[self setRecorder:newRecorder];
[newRecorder release];

success = YES;

return success;
}
4

0 回答 0