美文网首页iOS技术分享、交流
视频压缩和修改角度、大小

视频压缩和修改角度、大小

作者: 楓葉乄神無月 | 来源:发表于2016-11-25 20:50 被阅读105次
    #import <AVFoundation/AVFoundation.h>
    
    //调用
    //_VideoFilePath:视频文件路径
    NSDateFormatter *formater = [[NSDateFormatter alloc] init];//用时间给文件全名,以免重复,在测试的时候其实可以判断文件是否存在若存在,则删除,重新生成文件即可
    [formater setDateFormat:@"yyyy-MM-dd-HH:mm:ss"];
    NSString * resultPath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/output-%@.mov", [formater stringFromDate:[NSDate date]]];
    [Toolkit lowQuailtyWithInputURL:_VideoFilePath outputURL:[NSURL fileURLWithPath:resultPath] blockHandler:^(AVAssetExportSession *session) {
            if (session.status == AVAssetExportSessionStatusCompleted)
            {
                NSLog(@"压缩完成");
            }else if (session.status == AVAssetExportSessionStatusFailed) {
                NSLog(@"压缩失败");
            }
        }];
    
    //视频压缩
    + (void) lowQuailtyWithInputURL:(NSURL*)inputURL
                          outputURL:(NSURL*)outputURL
                       blockHandler:(void (^)(AVAssetExportSession*))handler
    {
        AVURLAsset *asset = [AVURLAsset URLAssetWithURL:inputURL options:nil];
        NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
        AVAssetTrack *videoTrack = [tracks objectAtIndex:0];
        
        CGAffineTransform translateToCenter;
        CGAffineTransform mixedTransform;
        AVMutableVideoComposition *waterMarkVideoComposition = [AVMutableVideoComposition videoComposition];
        waterMarkVideoComposition.frameDuration = CMTimeMake(1, 30);
        
        int degrees = [Toolkit degressFromVideoFileWithURL:inputURL];
        if (degrees == 0) {
            AVAssetExportSession *session = [[AVAssetExportSession alloc] initWithAsset:asset     presetName:AVAssetExportPresetMediumQuality];
            session.outputURL = outputURL;
            session.outputFileType = AVFileTypeQuickTimeMovie;
            [session exportAsynchronouslyWithCompletionHandler:^(void)
             {
                 handler(session);
             }];
        }else{
            if(degrees == 90){
                //顺时针旋转90°
                NSLog(@"视频旋转90度,home按键在左");
                translateToCenter = CGAffineTransformMakeTranslation(videoTrack.naturalSize.height, 0.0);
                mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI_2);
                waterMarkVideoComposition.renderSize = CGSizeMake(videoTrack.naturalSize.height,videoTrack.naturalSize.width);
            }else if(degrees == 180){
                //顺时针旋转180°
                NSLog(@"视频旋转180度,home按键在上");
                translateToCenter = CGAffineTransformMakeTranslation(videoTrack.naturalSize.width, videoTrack.naturalSize.height);
                mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI);
                waterMarkVideoComposition.renderSize = CGSizeMake(videoTrack.naturalSize.width,videoTrack.naturalSize.height);
            }else if(degrees == 270){
                //顺时针旋转270°
                NSLog(@"视频旋转270度,home按键在右");
                translateToCenter = CGAffineTransformMakeTranslation(0.0, videoTrack.naturalSize.width);
                mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI_2*3.0);
                waterMarkVideoComposition.renderSize = CGSizeMake(videoTrack.naturalSize.height,videoTrack.naturalSize.width);
            }
            
            
            AVMutableVideoCompositionInstruction *roateInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
            roateInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, [asset duration]);
            AVMutableVideoCompositionLayerInstruction *roateLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
            
            [roateLayerInstruction setTransform:mixedTransform atTime:kCMTimeZero];
            
            roateInstruction.layerInstructions = @[roateLayerInstruction];
            //将视频方向旋转加入到视频处理中
            waterMarkVideoComposition.instructions = @[roateInstruction];
            
            AVAssetExportSession *session = [[AVAssetExportSession alloc] initWithAsset:asset     presetName:AVAssetExportPresetMediumQuality];
            session.outputURL = outputURL;
            session.videoComposition = waterMarkVideoComposition;
            session.outputFileType = AVFileTypeQuickTimeMovie;
            [session exportAsynchronouslyWithCompletionHandler:^(void)
             {
                 handler(session);
             }];
        }
    }
    
    //获取视频角度
    +(int)degressFromVideoFileWithURL:(NSURL *)url
    {
        int degress = 0;
        
        AVAsset *asset = [AVAsset assetWithURL:url];
        NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
        if([tracks count] > 0) {
            AVAssetTrack *videoTrack = [tracks objectAtIndex:0];
            CGAffineTransform t = videoTrack.preferredTransform;
            
            if(t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0){
                // Portrait
                degress = 90;
            }else if(t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0){
                // PortraitUpsideDown
                degress = 270;
            }else if(t.a == 1.0 && t.b == 0 && t.c == 0 && t.d == 1.0){
                // LandscapeRight
                degress = 0;
            }else if(t.a == -1.0 && t.b == 0 && t.c == 0 && t.d == -1.0){
                // LandscapeLeft
                degress = 180;
            }
        }
        
        return degress;
    }
    
    //获取视频文件大小
    + (CGFloat) getFileSize:(NSString *)path
    {
        NSFileManager *fileManager = [[NSFileManager alloc] init];
        float filesize = -1.0;
        if ([fileManager fileExistsAtPath:path]) {
            NSDictionary *fileDic = [fileManager attributesOfItemAtPath:path error:nil];//获取文件的属性
            unsigned long long size = [[fileDic objectForKey:NSFileSize] longLongValue];
            filesize = 1.0*size/1024;
        }
        return filesize;
    }
    

    相关文章

      网友评论

      本文标题:视频压缩和修改角度、大小

      本文链接:https://www.haomeiwen.com/subject/flewpttx.html