【问题标题】:How to crop the video?如何裁剪视频?
【发布时间】:2013-09-07 12:50:46
【问题描述】:

我想在特定部分裁剪视频。给定高度、宽度、x 和 y,我想裁剪视频上的特定区域。有人知道吗?

我做了很多研究,但没有发现任何成果。我尝试使用 GPUImage Cropfilter 进行裁剪,但耗时太长。

我想尽快执行此操作,请建议我如何执行此操作的技术或示例。 提前致谢

【问题讨论】:

标签: iphone ios ios5 ios6 ios4


【解决方案1】:

您可以使用 AVMutableCompositionAVAssetExportSession 可以在 AVFoundation Framework

更多详情请访问苹果参考库AVMutableComposition Class ReferenceAVAssetExportSession Class Reference

AVAsset* asset = // Create your asset with source video url

AVMutableComposition *videoComposition = [AVMutableComposition composition];

AVMutableCompositionTrack *compositionVideoTrack = [videoComposition              addMutableTrackWithMediaType:AVMediaTypeVideo     preferredTrackID:kCMPersistentTrackID_Invalid];

AVAssetTrack *clipVideoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

AVMutableVideoComposition* videoComposition = [[AVMutableVideoComposition    videoComposition]retain];
videoComposition.renderSize = CGSizeMake(320, 240);
videoComposition.frameDuration = CMTimeMake(1, 30);

AVMutableVideoCompositionInstruction *instruction =    [AVMutableVideoCompositionInstruction videoCompositionInstruction];
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30) );

 AVMutableVideoCompositionLayerInstruction* transformer =    [AVMutableVideoCompositionLayerInstruction    videoCompositionLayerInstructionWithAssetTrack:clipVideoTrack];
CGAffineTransform finalTransform = // setup a transform that grows the video, effectively causing a crop
[transformer setTransform:finalTransform atTime:kCMTimeZero];
instruction.layerInstructions = [NSArray arrayWithObject:transformer];
videoComposition.instructions = [NSArray arrayWithObject: instruction];

CGSize videoSize = myVideoComposition.renderSize;

CALayer *parentLayer = [CALayer layer];

CALayer *videoLayer = [CALayer layer];

NSLog(@"%f %f",_playerLayer.frame.origin.x,_playerLayer.frame.size.width);

parentLayer.frame = CGRectMake( 0, 0  , cropsize.x , cropsize.y );

[videoLayer setPosition:CGPointMake(videoLayer.position.x, videoSize.height)];

[parentLayer addSublayer:videoLayer];


videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];

exporter = [[AVAssetExportSession alloc] initWithAsset:saveComposition    presetName:AVAssetExportPresetHighestQuality] ;
exporter.videoComposition = videoComposition;
exporter.outputURL=url3;
exporter.outputFileType=AVFileTypeQuickTimeMovie;

 [exporter exportAsynchronouslyWithCompletionHandler:^(void){}];

【讨论】:

  • 我已经用过这段代码了,CGAffineTransform 类的函数 CGAffineTransformMake() 只能水平或垂直翻转或旋转视频帧,但不会裁剪!看看这是你可以用 CGAffinetransformMake 做的事情(检查这个链接)tiddlyspace.com/bags/iphonesnipplets_public/tiddlers/…
  • 请检查上面我已经编辑的答案现在我们正在裁剪父层,我们必须在其上添加视频层作为子层,因此导出后我们将得到裁剪的视频
  • 什么是cropsize.x 和cropsize.y 它们是我们开始裁剪的坐标???
  • 上面的代码不行!!另外,您正在创建两个具有相同名称的对象 videoComposition...
猜你喜欢
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2011-09-06
  • 2011-09-06
相关资源
最近更新 更多