#pragma mark =====下面是合成视频的方法===========
- (void)vision:(PBJVision *)vision capturedVideo:(NSDictionary *)videoDict error:(NSError *)error
{
_recording = NO; //这句可能是控制完成存储之后就不能再录的。。。
if (error) {
NSLog(@"encounted an error in video capture (%@)", error);
return;
}
_currentVideo = videoDict;
NSString *videoPath = [_currentVideo objectForKey:PBJVisionVideoPathKey];
NSString* videoName = @"export.mov"; //这里换成wmv格式的就不行了。
NSString *exportPath = [NSTemporaryDirectory() stringByAppendingPathComponent:videoName];
[self loadVideoByPath:videoPath andSavePath:exportPath];
}
#pragma mark ==== 合成的========
- (void) loadVideoByPath:(NSString*) v_strVideoPath andSavePath:(NSString*) v_strSavePath {
NSLog(@"\nv_strVideoPath = %@ \nv_strSavePath = %@\n ",v_strVideoPath,v_strSavePath);
AVAsset *avAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:v_strVideoPath]];
CMTime assetTime = [avAsset duration];
Float64 duration = CMTimeGetSeconds(assetTime);
NSLog(@"视频时长 %f\n",duration);
AVMutableComposition *avMutableComposition = [AVMutableCompositioncomposition];
AVMutableCompositionTrack *avMutableCompositionTrack = [avMutableComposition addMutableTrackWithMediaType:AVMediaTypeVideopreferredTrackID:kCMPersistentTrackID_Invalid];
AVAssetTrack *avAssetTrack = [[avAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
NSError *error = nil;
// 这块是裁剪,rangtime .前面的是开始时间,后面是裁剪多长
[avMutableCompositionTrack insertTimeRange:CMTimeRangeMake(CMTimeMakeWithSeconds(0.1f, 30), CMTimeMakeWithSeconds(duration, 30))
ofTrack:avAssetTrack
atTime:kCMTimeZero
error:&error];
AVMutableVideoComposition *avMutableVideoComposition = [AVMutableVideoCompositionvideoComposition];
avMutableVideoComposition.renderSize = CGSizeMake(320.0f, 480.0f);
avMutableVideoComposition.frameDuration = CMTimeMake(1, 30);
// CALayer *animatedTitleLayer = [self buildAnimatedTitleLayerForSize:CGSizeMake(320, 88)];
UIImage *waterMarkImage = [UIImage imageNamed:@"logo.png"];
CALayer *waterMarkLayer = [CALayer layer];
waterMarkLayer.frame = CGRectMake(0, 60, 320, 222);
waterMarkLayer.contents = (id)waterMarkImage.CGImage;
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.frame = CGRectMake(0, 0, 320, 480);
videoLayer.frame = CGRectMake(0, 0, 320, 480);
[parentLayer addSublayer:videoLayer];
[parentLayer addSublayer:waterMarkLayer];
avMutableVideoComposition.animationTool = [AVVideoCompositionCoreAnimationToolvideoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
AVMutableVideoCompositionInstruction *avMutableVideoCompositionInstruction = [AVMutableVideoCompositionInstructionvideoCompositionInstruction];
[avMutableVideoCompositionInstruction setTimeRange:CMTimeRangeMake(kCMTimeZero, [avMutableComposition duration])];
AVMutableVideoCompositionLayerInstruction *avMutableVideoCompositionLayerInstruction = [AVMutableVideoCompositionLayerInstructionvideoCompositionLayerInstructionWithAssetTrack:avAssetTrack];
[avMutableVideoCompositionLayerInstruction setTransform:avAssetTrack.preferredTransform atTime:kCMTimeZero];
avMutableVideoCompositionInstruction.layerInstructions = [NSArray arrayWithObject:avMutableVideoCompositionLayerInstruction];
avMutableVideoComposition.instructions = [NSArray arrayWithObject:avMutableVideoCompositionInstruction];
NSFileManager *fm = [[NSFileManageralloc] 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 = [[AVAssetExportSessionalloc] initWithAsset:avMutableComposition presetName:AVAssetExportPreset640x480];
[avAssetExportSession setVideoComposition:avMutableVideoComposition];
[avAssetExportSession setOutputURL:[NSURL fileURLWithPath:v_strSavePath]];
avAssetExportSession.outputFileType = @"com.apple.quicktime-movie";
// [avAssetExportSession setOutputFileType:AVFileTypeQuickTimeMovie];//这句话要是要的话,会出错的。。。
[avAssetExportSession setShouldOptimizeForNetworkUse:YES];
[avAssetExportSession exportAsynchronouslyWithCompletionHandler:^(void){
//其实只要进入这个方法合成就已经成功了。。。。不需要再用下面的switch 了。。。这个问题我找了三天。。。终于发现了。。。。。。。把下面的switch语句删除就行了。,直接把成功以后的代码写到本方法就ok了。。。。。。。。。。。。。。。。。。。
switch (avAssetExportSession.status) {
caseAVAssetExportSessionStatusFailed:
NSLog(@"exporting failed %@",[avAssetExportSession error]);
break;
caseAVAssetExportSessionStatusCompleted:
NSLog(@"exporting completed");
//下面是按照上面的要求合成视频的过程。
// 下面是把视频存到本地相册里面,存储完后弹出对话框。
NSLog(@"该视频的大小为:%lf M",[self fileSizeAtPath:v_strSavePath]);
[_assetLibrary writeVideoAtPathToSavedPhotosAlbum:avAssetExportSession.outputURL completionBlock:^(NSURL *assetURL, NSError *error1) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"好的!" message: @"整合并保存成功!"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}];
break;
caseAVAssetExportSessionStatusCancelled:
NSLog(@"export cancelled");
break;
}
}];
if (avAssetExportSession.status != AVAssetExportSessionStatusCompleted){
NSLog(@"Retry export");
}
}
- (CALayer *)buildAnimatedTitleLayerForSize:(CGSize)videoSize
{
// 视频的显示大小
CGSize dataLayerSize = CGSizeMake(320.0f, 88.0f);
// Create a layer for the overall title animation.
CALayer *animatedTitleLayer = [CALayer layer];
// 由于旋转过了,所以高与宽互相转换了,原来 480*640 由于旋转 成了640*480
// 他们的起点还是左下角
animatedTitleLayer.frame = CGRectMake(0.0f, 0, dataLayerSize.width, dataLayerSize.height);
animatedTitleLayer.backgroundColor = [UIColor clearColor].CGColor;
// 水印
UIImage *waterMarkImage = [UIImage imageNamed:@"logo.png"];
CALayer *waterMarkLayer = [CALayer layer];
waterMarkLayer.contents = (id)waterMarkImage.CGImage ;
waterMarkLayer.frame = CGRectMake(0, 0, 320, 88);
waterMarkLayer.opacity = 0.6f;
// 文字
CATextLayer *textLayer = [CATextLayer layer];
textLayer.string = @"Add your context";
textLayer.font = (__bridge CFTypeRef)(@"Helvetica");
textLayer.fontSize = 20.0f;
textLayer.shadowOpacity = 0.6f ;
textLayer.backgroundColor = [UIColorclearColor].CGColor ;
textLayer.foregroundColor = [UIColorredColor].CGColor ;
textLayer.frame = CGRectMake(15.0f, dataLayerSize.height-20.0f-15.0f, dataLayerSize.width, 20.0f);
[animatedTitleLayer addSublayer:waterMarkLayer];
[animatedTitleLayer addSublayer:textLayer];
return animatedTitleLayer;
}
//单个文件的大小
//- (long long) fileSizeAtPath:(NSString*) filePath{
// NSFileManager* manager = [NSFileManager defaultManager];
// if ([manager fileExistsAtPath:filePath]){
// return [[manager attributesOfItemAtPath:filePath error:nil] fileSize];
// }
// return 0;
//}
//遍历文件夹获得文件夹大小,返回多少M
- (float ) folderSizeAtPath:(NSString*) folderPath{
NSFileManager* manager = [NSFileManagerdefaultManager];
if (![manager fileExistsAtPath:folderPath]) return 0;
NSEnumerator *childFilesEnumerator = [[manager subpathsAtPath:folderPath] objectEnumerator];
NSString* fileName;
long long folderSize = 0;
while ((fileName = [childFilesEnumerator nextObject]) != nil){
NSString* fileAbsolutePath = [folderPath stringByAppendingPathComponent:fileName];
folderSize += [self fileSizeAtPath:fileAbsolutePath];
}
return folderSize/(1024.0*1024.0);
}
相关推荐
用matlab实现视频水印,详细的代码,很不错的!
破解版是一款徽章水印删除软件,如果您在下载视频使用的过程中看到里面已经有官方的广告或者是logo水印,这种情况就需要将水印删除了,视频水印的删除与图片时不一样的,对于图片来说,直接选择水印的位置,点击删除...
基于JavaScript开发的短视频去水印微信小程序源码.zip基于JavaScript开发的短视频去水印微信小程序源码.zip基于JavaScript开发的短视频去水印微信小程序源码.zip基于JavaScript开发的短视频去水印微信小程序源码.zip...
2、本资源是基于DCT的视频水印技术Matlab代码实现,采用Matlab语言实现,基于DCT的实现方法。大学毕业设计可以使用。 3、适用于计算机,电子信息工程等专业的大学生课程设计和毕业设计。 4、支持答疑:有问题可以...
最新版去水印小程序源码,基于WordPress的短视频去水印小程序源码。本版本全开源,是Wordpress插件 上传到Wordpress 安装插件,启动之后绑定自己的小程序id就可以了。 wordpress可以在宝塔一键部署,也可以用源码带...
随机检测是视频水印需要解决的关键问题之一,目前的视频水印缺 乏有效的随机检测技术。对此,文中提出了一种适用于随机检测的稳健性视频水印方 法。该方法先将水印信号进行BCH编码并按密钥置换,然后将编码后的数据...
本文介绍了数字视频水印技术的定义,原理和主要应用领域,分析了视频水印的特点和面临的挑战,阐述了数字视频水印技术的分类,总结了视频算法方案的优缺点,归纳了数字视频的关键技术,最后探讨了数字视频水印技术的...
云开发全球手机验证码发放+短视频去水印等组合微信小程序源码 带流量主 这是一款特别的小程序,验证码功能可能大家都还没见过吧! 支持全球验证码发放,支持激励视频查看更多手机号码 另外还有短视频平台去水印解析...
最新短视频去水印小程序源码,前端+后端,内置接口+第三方接口,修复数据库账号密码错误问题,内置接口支持替换第三方接口,看了一下文件挺全的,可以添加流量主代码,搭建需要准备一台服务器,备案域名,小程序开发...
基于MPEG-4的视频水印算法,孙明瑞,,本文提出一种新的抵抗共谋攻击、MPEG-4压缩攻击和帧下降攻击的视频水印算法。此算法基于视频拼接技术,将其应用在视频水印中选择一
视频去水印破解工具.zip 直接运行汉化版,可以去掉水印 视频去水印破解工具.zip视频去水印破解工具.zip
视频水印是用来实现版权保护的有效技术,也是目前水印领域中的研究热点。在研究总结国内外视频数字水印现状 的基础上,简要地介绍了视频水印的原理及特点,阐述了典型视频水印算法及各自的优缺点,分析了针对视频...
一个短视频去水印的小程序源码和API接口源码,github地址
Easy Video Logo Remover,简单的视频水印去除工具。这是一款小巧、简单、易用的视频去水印工具,让您通过裁剪视频或移除视频文件中插入的水印和其它元素(如 LOGO、签名或字幕等等之类的)来改善图像质量。 它采用...
数字水印是DRM系统实现版权保护的基本手段,前述的鲁棒图像和视频水印算法可以抵抗试图祛除水印的攻击。协议攻击并不祛除水印,而是通过添加一个伪造的水印来干扰版权的认,现有的鲁棒水印算法无法抵抗这种攻击,而...
EasePaint Watermark Expert 是来自国外的一款...同时还支持以向导模式修复旧照片中的划痕和瑕疵,让记忆重新回来,想知道图片和视频水印怎么去掉吗,强烈推荐大家试试EasePaint Watermark Expert这款水印去除神器。
全新短视频去水印微信小程序源码下载,外卖 CPS系统。本微信小程序含流量主支持:激励视频、插屏广告、视频广告,支持会员系统! 支持短视频秒速级解析+批量短视频解析+图集解析。 各个页面轮播图均支持后台替换...
短视频去水印小帮手微信小程序源码是一款带后台的工具应用程序,可帮助用户快速去除短视频中的水印,并支持限制解析次数和流量主。该应用程序还带有 PHP 后台,使用前需要确认已安装 composer。如果用户使用 Laravel...
用于去除视频水印,功能无限制,经测试可用