Mrugesh Tank
Mrugesh Tank

Reputation: 3560

AVAssetExportSession video not saving as portrait orientation

I want to record on video in custom view so I'm using AVFoundation as per below code.

if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL])
        {


        /** Below code works fine (save in portrait orientation)
        [library writeVideoAtPathToSavedPhotosAlbum:outputFileURL
                                    completionBlock:^(NSURL *assetURL, NSError *error)
         {
             if (!error)
             {
                 self.doneButton.userInteractionEnabled = YES;
                 [videoAddr addObject:assetURL];
                 videoURL = outputFileURL;
             }
         }];*/



        AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];
        AVMutableCompositionTrack *track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

            AVAsset *asset = [AVAsset assetWithURL:outputFileURL];
            [track insertTimeRange:CMTimeRangeMake(kCMTimeZero, asset.duration) ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:CMTimeMake(0, 1) error:nil];

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *myPathDocs =  [documentsDirectory stringByAppendingPathComponent:
                                 [NSString stringWithFormat:@"%@%d.mov",NSBundle.mainBundle.infoDictionary[@"CFBundleExecutable"],++videoCounter]];
        [[NSFileManager defaultManager] removeItemAtPath:myPathDocs error:nil];

        NSLog(@"movie added to path:%@",myPathDocs);
        NSURL *url = [NSURL fileURLWithPath:myPathDocs];
        AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition
                                                                          presetName:AVAssetExportPresetHighestQuality];
        exporter.outputURL=url;
        exporter.outputFileType = AVFileTypeQuickTimeMovie;
        exporter.shouldOptimizeForNetworkUse = YES;
        [exporter exportAsynchronouslyWithCompletionHandler:^{
            dispatch_async(dispatch_get_main_queue(), ^{
                self.doneButton.userInteractionEnabled = YES;
                [videoAddr addObject:exporter.outputURL];
                videoURL = outputFileURL;
                flagAutorotate = NO;
            });
        }];
    }

But video is going to save in landscape mode only. I've refer this and added below code

    CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(M_PI_2);
    //    CGAffineTransform rotateTranslate = CGAffineTransformTranslate(rotationTransform,360,0);
    track.preferredTransform = rotationTransform;

But after adding this not getting proper result. So please help me to solve this issue...

Upvotes: 1

Views: 3008

Answers (1)

Motoyasu Abo
Motoyasu Abo

Reputation: 56

you should use AVMutableVideoCompositionInstruction and layerInstruction

AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);

AVMutableVideoCompositionLayerInstruction *layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:compositionVideoTrack];

CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(M_PI_2);

[layerInstruction setTransform:rotationTransform atTime:kCMTimeZero];
instruction.layerInstructions = @[layerInstruction];

AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
videoComposition.renderSize = CGSizeMake(videoWidth, videoHeight);
videoComposition.instructions = @[instruction];
videoComposition.frameDuration = CMTimeMake(1, 30);

AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality];
exporter.outputURL = exportURL;
exporter.outputFileType = AVFileTypeQuickTimeMovie;
exporter.videoComposition = videoComposition;

[exporter exportAsynchronouslyWithCompletionHandler:^{

}];

Upvotes: 2

Related Questions