AVAsset *avAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:v_strVideoPath]];
AVMutableComposition *avMutableComposition = [AVMutableComposition composition];
AVMutableCompositionTrack *avMutableCompositionTrack = [avMutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVAssetTrack *avAssetTrack = [[avAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
NSError *error = nil;
[avMutableCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:avAssetTrack atTime:kCMTimeZero error:nil];
AVMutableVideoComposition *avMutableVideoComposition = [AVMutableVideoComposition videoComposition] ;
// 这个视频大小可以由你自己设置
if([_captureSession.sessionPreset isEqualToString:AVCaptureSessionPreset1920x1080]){
avMutableVideoComposition.renderSize = CGSizeMake(1080, 1080);
}else if([_captureSession.sessionPreset isEqualToString:AVCaptureSessionPreset1280x720]){
avMutableVideoComposition.renderSize = CGSizeMake(720, 720);
}else if([_captureSession.sessionPreset isEqualToString:AVCaptureSessionPreset640x480]){
avMutableVideoComposition.renderSize = CGSizeMake(480, 480);
}else if([_captureSession.sessionPreset isEqualToString:AVCaptureSessionPresetMedium]){
avMutableVideoComposition.renderSize = CGSizeMake(360, 360);
}
// avMutableVideoComposition.renderSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width);
avMutableVideoComposition.frameDuration = CMTimeMake(1, 24);
UIImage* waterMark=[UIImage imageNamed:@"视频水印"];
CALayer* aLayer=[CALayer layer];
aLayer.contents=(id)waterMark.CGImage;
//坐标是我自己的算法,换成自己的就行了,注意y坐标是反向的
aLayer.frame=CGRectMake(avMutableVideoComposition.renderSize.width-[NSObject convertPx:264],avMutableVideoComposition.renderSize.height-[NSObject convertPx:90] , [NSObject convertPx:238], [NSObject convertPx:62]);
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.backgroundColor=[[UIColor yellowColor]CGColor];
parentLayer.frame = CGRectMake(0, 0, avMutableVideoComposition.renderSize.width, avMutableVideoComposition.renderSize.height);
videoLayer.frame = CGRectMake(0, 0, avMutableVideoComposition.renderSize.width, avMutableVideoComposition.renderSize.height);
[parentLayer addSublayer:videoLayer];
[parentLayer addSublayer:aLayer];
avMutableVideoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
AVMutableVideoCompositionInstruction *avMutableVideoCompositionInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
[avMutableVideoCompositionInstruction setTimeRange:CMTimeRangeMake(kCMTimeZero, [avMutableComposition duration])];
AVMutableVideoCompositionLayerInstruction *avMutableVideoCompositionLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:avAssetTrack];
[avMutableVideoCompositionLayerInstruction setTransform:avAssetTrack.preferredTransform atTime:kCMTimeZero];
avMutableVideoCompositionInstruction.layerInstructions = [NSArray arrayWithObject:avMutableVideoCompositionLayerInstruction];
avMutableVideoComposition.instructions = [NSArray arrayWithObject:avMutableVideoCompositionInstruction];
NSFileManager *fm = [[NSFileManager alloc] init];
if ([fm fileExistsAtPath:v_strSavePath]) {
NSLog(@"video is have. then delete that");
if ([fm removeItemAtPath:v_strSavePath error:&error]) {
NSLog(@"delete is ok");
}else {
NSLog(@"delete is no error = %@",error.description);
}
}
avAssetExportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPreset1280x720];
[avAssetExportSession setVideoComposition:avMutableVideoComposition];
[avAssetExportSession setOutputURL:[NSURL fileURLWithPath:v_strSavePath]];
[avAssetExportSession setOutputFileType:AVFileTypeMPEG4];
[avAssetExportSession setShouldOptimizeForNetworkUse:YES];
NSLog(@"start export time:%ld",(long)[[NSDate date]timeIntervalSince1970]);
[avAssetExportSession exportAsynchronouslyWithCompletionHandler:^(void){
switch (avAssetExportSession.status) {
case AVAssetExportSessionStatusFailed:
NSLog(@"exporting failed %@",[avAssetExportSession error]);
break;
case AVAssetExportSessionStatusCompleted:
NSLog(@"end export time:%ld",(long)[[NSDate date]timeIntervalSince1970]);
// 想做什么事情在这个做
break;
case AVAssetExportSessionStatusCancelled:
NSLog(@"export cancelled");
break;
}
}];
AVMutableComposition *avMutableComposition = [AVMutableComposition composition];
AVMutableCompositionTrack *avMutableCompositionTrack = [avMutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVAssetTrack *avAssetTrack = [[avAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
NSError *error = nil;
[avMutableCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:avAssetTrack atTime:kCMTimeZero error:nil];
AVMutableVideoComposition *avMutableVideoComposition = [AVMutableVideoComposition videoComposition] ;
// 这个视频大小可以由你自己设置
if([_captureSession.sessionPreset isEqualToString:AVCaptureSessionPreset1920x1080]){
avMutableVideoComposition.renderSize = CGSizeMake(1080, 1080);
}else if([_captureSession.sessionPreset isEqualToString:AVCaptureSessionPreset1280x720]){
avMutableVideoComposition.renderSize = CGSizeMake(720, 720);
}else if([_captureSession.sessionPreset isEqualToString:AVCaptureSessionPreset640x480]){
avMutableVideoComposition.renderSize = CGSizeMake(480, 480);
}else if([_captureSession.sessionPreset isEqualToString:AVCaptureSessionPresetMedium]){
avMutableVideoComposition.renderSize = CGSizeMake(360, 360);
}
// avMutableVideoComposition.renderSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.width);
avMutableVideoComposition.frameDuration = CMTimeMake(1, 24);
UIImage* waterMark=[UIImage imageNamed:@"视频水印"];
CALayer* aLayer=[CALayer layer];
aLayer.contents=(id)waterMark.CGImage;
//坐标是我自己的算法,换成自己的就行了,注意y坐标是反向的
aLayer.frame=CGRectMake(avMutableVideoComposition.renderSize.width-[NSObject convertPx:264],avMutableVideoComposition.renderSize.height-[NSObject convertPx:90] , [NSObject convertPx:238], [NSObject convertPx:62]);
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.backgroundColor=[[UIColor yellowColor]CGColor];
parentLayer.frame = CGRectMake(0, 0, avMutableVideoComposition.renderSize.width, avMutableVideoComposition.renderSize.height);
videoLayer.frame = CGRectMake(0, 0, avMutableVideoComposition.renderSize.width, avMutableVideoComposition.renderSize.height);
[parentLayer addSublayer:videoLayer];
[parentLayer addSublayer:aLayer];
avMutableVideoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
AVMutableVideoCompositionInstruction *avMutableVideoCompositionInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
[avMutableVideoCompositionInstruction setTimeRange:CMTimeRangeMake(kCMTimeZero, [avMutableComposition duration])];
AVMutableVideoCompositionLayerInstruction *avMutableVideoCompositionLayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:avAssetTrack];
[avMutableVideoCompositionLayerInstruction setTransform:avAssetTrack.preferredTransform atTime:kCMTimeZero];
avMutableVideoCompositionInstruction.layerInstructions = [NSArray arrayWithObject:avMutableVideoCompositionLayerInstruction];
avMutableVideoComposition.instructions = [NSArray arrayWithObject:avMutableVideoCompositionInstruction];
NSFileManager *fm = [[NSFileManager alloc] init];
if ([fm fileExistsAtPath:v_strSavePath]) {
NSLog(@"video is have. then delete that");
if ([fm removeItemAtPath:v_strSavePath error:&error]) {
NSLog(@"delete is ok");
}else {
NSLog(@"delete is no error = %@",error.description);
}
}
avAssetExportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPreset1280x720];
[avAssetExportSession setVideoComposition:avMutableVideoComposition];
[avAssetExportSession setOutputURL:[NSURL fileURLWithPath:v_strSavePath]];
[avAssetExportSession setOutputFileType:AVFileTypeMPEG4];
[avAssetExportSession setShouldOptimizeForNetworkUse:YES];
NSLog(@"start export time:%ld",(long)[[NSDate date]timeIntervalSince1970]);
[avAssetExportSession exportAsynchronouslyWithCompletionHandler:^(void){
switch (avAssetExportSession.status) {
case AVAssetExportSessionStatusFailed:
NSLog(@"exporting failed %@",[avAssetExportSession error]);
break;
case AVAssetExportSessionStatusCompleted:
NSLog(@"end export time:%ld",(long)[[NSDate date]timeIntervalSince1970]);
// 想做什么事情在这个做
break;
case AVAssetExportSessionStatusCancelled:
NSLog(@"export cancelled");
break;
}
}];