视频旋转、裁剪

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;
            }
        }
    }];


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容