2013-05-13 111 views
3

我正在一个应用程序,其中用户将有设施放大和缩小视频。我正在使用AV Foundation录制视频,但当用户录制视频时,我无法放大和缩小视频。视频放大和缩小,同时录制iphone

我使用下面的代码来记录视频

- (void) startCamera 
    NSLog(@"Setting up capture session"); 
     CaptureSession = [[AVCaptureSession alloc] init]; 

     //----- ADD INPUTS ----- 
     NSLog(@"Adding video input"); 

     //ADD VIDEO INPUT 
     AVCaptureDevice *VideoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
     if (VideoDevice) 
     { 
      NSError *error; 
      VideoInputDevice = [AVCaptureDeviceInput deviceInputWithDevice:VideoDevice error:&error]; 
      if (!error) 
      { 
       if ([CaptureSession canAddInput:VideoInputDevice]) 
        [CaptureSession addInput:VideoInputDevice]; 
       else 
        NSLog(@"Couldn't add video input"); 
      } 
      else 
      { 
       NSLog(@"Couldn't create video input"); 
      } 
     } 
     else 
     { 
      NSLog(@"Couldn't create video capture device"); 
     } 

     //ADD AUDIO INPUT 
     NSLog(@"Adding audio input"); 
     AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; 
     NSError *error = nil; 
     AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error]; 
     if (audioInput) 
     { 
      [CaptureSession addInput:audioInput]; 
     } 


     //----- ADD OUTPUTS ----- 

     //ADD VIDEO PREVIEW LAYER 
     NSLog(@"Adding video preview layer"); 
     [self setPreviewLayer:[[AVCaptureVideoPreviewLayer alloc] initWithSession:CaptureSession]]; 

     PreviewLayer.orientation = AVCaptureVideoOrientationPortrait;  //<<SET ORIENTATION. You can deliberatly set this wrong to flip the image and may actually need to set it wrong to get the right image 

     [[self PreviewLayer] setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 


     //ADD MOVIE FILE OUTPUT 
     NSLog(@"Adding movie file output"); 
     MovieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 

     Float64 TotalSeconds = 60;   //Total seconds 
     int32_t preferredTimeScale = 30; //Frames per second 
     CMTime maxDuration = CMTimeMakeWithSeconds(TotalSeconds, preferredTimeScale); //<<SET MAX DURATION 
     MovieFileOutput.maxRecordedDuration = maxDuration; 

     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) 



     //----- SET THE IMAGE QUALITY/RESOLUTION ----- 
     //Options: 
     // AVCaptureSessionPresetHigh - Highest recording quality (varies per device) 
     // AVCaptureSessionPresetMedium - Suitable for WiFi sharing (actual values may change) 
     // AVCaptureSessionPresetLow - Suitable for 3G sharing (actual values may change) 
     // AVCaptureSessionPreset640x480 - 640x480 VGA (check its supported before setting it) 
     // AVCaptureSessionPreset1280x720 - 1280x720 720p HD (check its supported before setting it) 
     // AVCaptureSessionPresetPhoto - Full photo resolution (not supported for video output) 
     NSLog(@"Setting image quality"); 
     [CaptureSession setSessionPreset:AVCaptureSessionPresetMedium]; 
     if ([CaptureSession canSetSessionPreset:AVCaptureSessionPreset640x480])  //Check size based configs are supported before setting them 
      [CaptureSession setSessionPreset:AVCaptureSessionPreset640x480]; 



     //----- DISPLAY THE PREVIEW LAYER ----- 
     //Display it full screen under out view controller existing controls 
     NSLog(@"Display the preview layer"); 
     CGRect layerRect; 
     layerRect = CGRectMake(284, 0, 200, 200); 

     [PreviewLayer setBounds:layerRect]; 
     [PreviewLayer setPosition:CGPointMake(CGRectGetMidX(layerRect), 
               CGRectGetMidY(layerRect))]; 
     //[[[self view] layer] addSublayer:[[self CaptureManager] previewLayer]]; 
     //We use this instead so it goes on a layer behind our UI controls (avoids us having to manually bring each control to the front): 
     UIView *CameraView = [[UIView alloc] init]; 
     [[self view] addSubview:CameraView]; 
     [self.view sendSubviewToBack:CameraView]; 

     [[CameraView layer] addSublayer:PreviewLayer]; 


     //----- START THE CAPTURE SESSION RUNNING ----- 
     [CaptureSession startRunning]; 
} 

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

    //Set landscape (if required) 
    if ([CaptureConnection isVideoOrientationSupported]) 
    { 
     AVCaptureVideoOrientation orientation = AVCaptureVideoOrientationPortrait;  //<<<<<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); 
} 

//********** DID FINISH RECORDING TO OUTPUT FILE AT URL ********** 
- (void)captureOutput:(AVCaptureFileOutput *)captureOutput 
didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL 
     fromConnections:(NSArray *)connections 
       error:(NSError *)error 
{ 

    NSLog(@"didFinishRecordingToOutputFileAtURL - enter"); 

    BOOL RecordedSuccessfully = YES; 
    if ([error code] != noErr) 
    { 
     // A problem occurred: Find out if the recording was successful. 
     id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessfullyFinishedKey]; 
     if (value) 
     { 
      RecordedSuccessfully = [value boolValue]; 
     } 
    } 
    if (RecordedSuccessfully) 
    { 
     //----- RECORDED SUCESSFULLY ----- 
     NSLog(@"didFinishRecordingToOutputFileAtURL - success"); 
     ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
     if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL]) 
     { 
      [library writeVideoAtPathToSavedPhotosAlbum:outputFileURL 
             completionBlock:^(NSURL *assetURL, NSError *error) 
      { 
       if (error) 
       { 

       } 
      }]; 
     } 

    } 
} 

任何帮助将是巨大的

+0

https://discussions.apple.com/thread/2517126?start=0&tstart=0 – Rushabh 2013-05-13 07:29:59

回答

0

不能放大的iPhone拍照,在最好的情况,你可以一边拍照使用cameraViewTransform:和应用转换到相机的即时取景,但仍不会影响拍摄的最终照片