2012-11-16 4 views
1

iOS를 처음 사용합니다.iOS에서 동영상 회전

나는 기록 비디오를위한 앱을 가지고 있으며 iPad에서 재생할 수 있습니다.

이제보기에서 카메라를 열어야합니다. 그래서 저는 그것을 위해 avcapturesession을 사용했습니다.

이제 코딩으로 비디오를 녹화하고 재생할 수 있지만 기록 된 비디오는 회전 된 모드입니다.

저는 LandscapeRight를 사용하여 녹음합니다.

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
        captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 

        captureVideoPreviewLayer.orientation=AVCaptureVideoOrientationLandscapeRight; 
        captureVideoPreviewLayer.frame = vwvideo.bounds; 

        [vwvideo.layer addSublayer:captureVideoPreviewLayer]; 

        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

        NSError *error = nil; 
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 
        if (!input) { 
         // Handle the error appropriately. 
         NSLog(@"ERROR: trying to open camera: %@", error); 
        } 

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

        AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 

        NSString *documentsDirectory = [paths objectAtIndex:0]; 

        NSDateFormatter *dateFormat = [[[NSDateFormatter alloc] init] autorelease]; 
        [dateFormat setDateFormat:@"yyyy-MM-dd HH.mm.SS"]; 
        NSDate *now = [[[NSDate alloc] init] autorelease]; 
        theDate = [dateFormat stringFromDate:now]; 

        NSString *tempPath = [NSString stringWithFormat:@"%@/%@.mp4",documentsDirectory,theDate]; 
        [tempPath retain]; 
        NSLog(@"Path::%@",tempPath); 

        NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:tempPath]; 
             [session addInput:input]; 
        [session addOutput:movieFileOutput]; 
        [session commitConfiguration]; 
        [session startRunning]; 

        [movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self]; 

답변

6

http://www.raywenderlich.com/13418/how-to-play-record-edit-videos-in-ios/videoplayrecord

당신이 다음이가 그에 주어진 샘플 프로젝트의 코드가 올바른 방향으로 회전 된 비디오를 해결하기 쉬운 튜토리얼 철저한 가면 : 여기

내 코딩입니다 스 니펫 (RecordVideo.m 파일)

 //FIXING ORIENTATION// 
    AVMutableVideoCompositionLayerInstruction *FirstlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:firstTrack]; 
    AVAssetTrack *FirstAssetTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
    UIImageOrientation FirstAssetOrientation_ = UIImageOrientationUp; 
    BOOL isFirstAssetPortrait_ = NO; 
    CGAffineTransform firstTransform = FirstAssetTrack.preferredTransform; 
    if(firstTransform.a == 0 && firstTransform.b == 1.0 && firstTransform.c == -1.0 && firstTransform.d == 0) {FirstAssetOrientation_= UIImageOrientationRight; isFirstAssetPortrait_ = YES;} 
    if(firstTransform.a == 0 && firstTransform.b == -1.0 && firstTransform.c == 1.0 && firstTransform.d == 0) {FirstAssetOrientation_ = UIImageOrientationLeft; isFirstAssetPortrait_ = YES;} 
    if(firstTransform.a == 1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == 1.0) {FirstAssetOrientation_ = UIImageOrientationUp;} 
    if(firstTransform.a == -1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == -1.0) {FirstAssetOrientation_ = UIImageOrientationDown;} 
    CGFloat FirstAssetScaleToFitRatio = 1.0; 
    if(isFirstAssetPortrait_){ 
     FirstAssetScaleToFitRatio = 1.0; 
     CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio); 
     [FirstlayerInstruction setTransform:CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor) atTime:kCMTimeZero]; 
    }else{ 
     CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio); 
     [FirstlayerInstruction setTransform:CGAffineTransformConcat(CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor),CGAffineTransformMakeTranslation(0, 160)) atTime:kCMTimeZero]; 
    } 

    [FirstlayerInstruction setOpacity:0.0 atTime:videoAsset.duration]; 

    AVMutableVideoCompositionLayerInstruction *SecondlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:AudioTrack]; 


    MainInstruction.layerInstructions = [NSArray arrayWithObjects:FirstlayerInstruction,nil];; 

    AVMutableVideoComposition *MainCompositionInst = [AVMutableVideoComposition videoComposition]; 
    MainCompositionInst.instructions = [NSArray arrayWithObject:MainInstruction]; 
    MainCompositionInst.frameDuration = CMTimeMake(1, 30); 
    MainCompositionInst.renderSize = CGSizeMake(360.0, 480.0); 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *myPathDocs = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"orientationFixedVideo-%d.mov",arc4random() % 1000]]; 

    NSURL *url = [NSURL fileURLWithPath:myPathDocs]; 

    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetMediumQuality]; 
    exporter.outputURL=url; 
    exporter.outputFileType = AVFileTypeQuickTimeMovie; 
    exporter.videoComposition = MainCompositionInst; 
    exporter.shouldOptimizeForNetworkUse = YES; 
    [exporter exportAsynchronouslyWithCompletionHandler:^ 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self exportDidFinish:exporter]; 
     }); 
    }]; 
관련 문제