4

iOS 中是否有任何框架提供录制具有放大/缩小功能的视频的功能。我尝试使用 AVFoundation 框架但没有取得任何成功。我正在使用以下代码录制视频

    - (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)
                 {

                 }
             }];
        }

    }
}
4

0 回答 0