美文网首页
视频旋转、裁剪

视频旋转、裁剪

作者: yitez | 来源:发表于2020-11-07 19:37 被阅读0次

    iOS应用层的API无法对视频源数据进行直接操作,所以想要对视频进行修改,需要进行一次导出操作。可以使用AVAssetExportSession来实现。

    #mark 这里可以设置质量,主要针对需要对视频进行压缩。这个方法只能粗略设置,想要更精细设置可以使用AVAssetReader和AVAssetWriterInput的API。
        AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:asset
                                                                                presetName:AVAssetExportPresetMediumQuality];
        NSInteger degress = 0;
        switch (orientation) {
            case UIImageOrientationUp:
                degress = 0;
                break;
            case UIImageOrientationRight:
                degress = 90;
                break;
            case UIImageOrientationDown:
                degress = 180;
                break;
            case UIImageOrientationLeft:
                degress = 270;
                break;
                
        }
        AVAssetTrack *videoAssetTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] firstObject];
         //计算好角度和renderSize
        if (videoAssetTrack && degress != 0 ) {
            CGAffineTransform translateToCenter;
            CGAffineTransform mixedTransform;
            AVMutableVideoComposition* videoComposition = [AVMutableVideoComposition videoComposition];
            videoComposition.frameDuration = videoAssetTrack.minFrameDuration;
            if(degress == 90){
                translateToCenter = CGAffineTransformMakeTranslation(videoAssetTrack.naturalSize.height,0.0);
                mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI_2);
                videoComposition.renderSize = CGSizeMake(videoAssetTrack.naturalSize.height,videoAssetTrack.naturalSize.width);
            }else if(degress == 180){
                translateToCenter = CGAffineTransformMakeTranslation(videoAssetTrack.naturalSize.width, videoAssetTrack.naturalSize.height);
                mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI);
                videoComposition.renderSize = CGSizeMake(videoAssetTrack.naturalSize.width,videoAssetTrack.naturalSize.height);
            }else if(degress == 270){
                translateToCenter = CGAffineTransformMakeTranslation(0.0, videoAssetTrack.naturalSize.width);
                mixedTransform = CGAffineTransformRotate(translateToCenter,M_PI_2*3.0);
                videoComposition.renderSize = CGSizeMake(videoAssetTrack.naturalSize.height,videoAssetTrack.naturalSize.width);
            } else {
                mixedTransform = videoAssetTrack.preferredTransform;
                CGSize renderSize = CGSizeMake(videoAssetTrack.naturalSize.width, videoAssetTrack.naturalSize.height);
                videoComposition.renderSize = renderSize;
            }
            
            AVMutableVideoCompositionInstruction *videoCompositionInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
           #mark设置需要的裁剪时间
            videoCompositionInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);
    
            AVMutableVideoCompositionLayerInstruction *videoCompositionLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoAssetTrack];
            #mark设置旋转角度
            [videoCompositionLayerInstruction setTransform:mixedTransform atTime:kCMTimeZero];
            
            videoCompositionInstruction.layerInstructions = [NSArray arrayWithObject:videoCompositionLayerInstruction];
            videoComposition.instructions = [NSArray arrayWithObject: videoCompositionInstruction];
            exportSession.videoComposition = videoComposition;
        }
    

    执行导出:

       [exportSession exportAsynchronouslyWithCompletionHandler:^{
            AVAssetExportSessionStatus status = [exportSession status];
            switch (status)
            {
                case AVAssetExportSessionStatusCompleted:
                {
              
                    break;
                }
                case AVAssetExportSessionStatusFailed:
                {
              
                    break;
                }
                default:
                {
                    NSLog(@"Exporter status not fialed or complete: %ld", status);
                    break;
                }
            }
        }];
    
    
    

    相关文章

      网友评论

          本文标题:视频旋转、裁剪

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