视频旋转、裁剪
最编程
2024-01-22 18:14:17
...
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;
}
}
}];
推荐阅读
-
Qt 音视频开发 17-海康 sdk 解码
-
Qt Writing 安全视频监控系统 29-掉线重连
-
视频|你不知道的开源 60 年
-
人爱视频网络 HTTP 升级为 HTTPS,为您提供更安全、更放心、更流畅的视听体验!
-
最新优化升级版全民影视电影视频网站源码2.6版五级分销分级推广版
-
全新升级的瀚纳仕跑道是一个一分钟的视频,可以在所有平台上推广,因此你可以轻松日赚 1000!
-
iOS 16 的新错误:无法在 Final Cut Pro 和 iMovie 中打开电影效果视频
-
解决新版 Edge 浏览器的卡顿、速度变慢和视频掉帧问题
-
ffmpeg 可修改视频文件的分辨率
-
重装电脑系统后播放视频卡顿怎么办?