`
zjjzmw1
  • 浏览: 1367939 次
  • 性别: Icon_minigender_1
  • 来自: 开封
社区版块
存档分类
最新评论

视频水印

    博客分类:
  • iOS
阅读更多

#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);

 

}

4
0
分享到:
评论
2 楼 zjjzmw1 2013-12-29  
。。。确实,刚发现没有声音,有机会我再看看,最近开了个新项目,视频这个暂时不让研究了。。
1 楼 mymmsc 2013-12-28  
录完之后没有声音

相关推荐

    基于JavaScript开发的短视频去水印微信小程序源码.zip

    基于JavaScript开发的短视频去水印微信小程序源码.zip基于JavaScript开发的短视频去水印微信小程序源码.zip基于JavaScript开发的短视频去水印微信小程序源码.zip基于JavaScript开发的短视频去水印微信小程序源码.zip...

    超好用批量视频去水印工具

    综上所述,"超好用批量视频去水印工具"是一款集高效、高质量和易用性于一体的解决方案,适用于需要批量处理视频水印的各类用户。无论是个人还是团队,无论是为了创意编辑还是版权保护,它都能成为视频处理流程中的...

    视频去水印资源网站,可以去除各种格式的水印

    然而,在一些情况下,用户可能希望将视频水印去除,比如在观看视频时,水印影响了观看体验,或者需要使用视频内容但不希望显示水印等。 通常,视频去水印的过程可以通过以下几种方法实现: 基于图像处理的方法: ...

    短视频去水印解析HTML源码

    在当前的互联网时代,短视频平台已经成为了人们分享生活、娱乐休闲的重要途径,而这些平台为了保护版权,通常会在视频上添加水印。然而,有些用户可能有去除这些水印的需求,比如为了二次创作或者个人收藏。"短视频...

    短视频去水印小帮手微信小程序源码带后台

    此小程序的主要任务是从短视频平台的URL中提取无水印的视频内容,通过解析视频的元数据,找到并去除加在视频上的水印。这涉及到网络请求、视频解析和文件处理等多个技术环节,对于开发者来说,既是一个挑战,也是一...

    视频水印技术综述

    【视频水印技术综述】 视频水印技术是一种用于版权保护的重要手段,它在数字多媒体领域,特别是视频内容中嵌入不可见或不易察觉的标识信息,以防止未经授权的复制、篡改和非法传播。这一技术是当前水印研究领域的...

    视频去水印

    在数字化媒体盛行的时代,无论是个人还是企业,都有可能遇到需要去除视频水印的需求,比如去除影片中的广告、版权标识或者不合适的画面等。本软件是一款小巧而实用的工具,专为这一需求设计。 首先,我们要理解...

    非常好用的去视频水印工具

    标题提到的“非常好用的去视频水印工具”正是一款专为此目的设计的应用,它能有效地帮助用户移除视频中的水印,从而让视频看起来更加纯净和专业。 首先,我们需要理解视频水印是什么。视频水印通常是由视频制作者...

    AI去除图片和视频水印工具

    标题中的“AI去除图片和视频水印工具”指的是利用人工智能技术来移除图像和视频文件中的水印。这种工具通常采用深度学习算法,通过训练模型识别并修复水印区域,以达到去除水印的效果。在现代数字媒体处理中,去除...

    视频水印matlab程序

    视频水印技术是一种数字版权保护方法,通过在原始视频中嵌入不可见或微弱可见的信息,如作者标识、版权信息或追踪数据,以确保内容的原创性和防止未经授权的复制或篡改。在MATLAB环境下实现视频水印,可以利用其强大...

    python利用opencv自动去除视频水印的示例

    在Python编程领域,OpenCV库是一个非常强大的工具,它广泛应用于...总的来说,利用OpenCV去除视频水印是一项挑战性的任务,但通过理解图像处理的基本原理和技巧,结合Python编程,我们可以实现自动化去除水印的目标。

    视频去水印工具(Remove Logo from Video) 最新v4.0 破解版,好用爽到爆。

    破解版是一款徽章水印删除软件,如果您在下载视频使用的过程中看到里面已经有官方的广告或者是logo水印,这种情况就需要将水印删除了,视频水印的删除与图片时不一样的,对于图片来说,直接选择水印的位置,点击删除...

    数字视频水印毕业论文

    ### 数字视频水印毕业论文知识点总结 #### 一、数字视频水印技术的重要性与研究现状 - **选题背景及意义**: - 数字水印技术在信息安全领域占据重要地位,尤其针对数字视频这一多媒体产品的核心部分,提供有效的...

    去视频水印软件

    "去视频水印软件"就是专门解决这一问题的工具,它能帮助用户快速、有效地从视频中移除不必要的标识或标记。 视频水印通常分为两种类型:静态水印和动态水印。静态水印是在视频的一个固定位置添加的文字或图像,而...

    基于DCT的视频水印技术Matlab代码实现(毕设专用)

    2、本资源是基于DCT的视频水印技术Matlab代码实现,采用Matlab语言实现,基于DCT的实现方法。大学毕业设计可以使用。 3、适用于计算机,电子信息工程等专业的大学生课程设计和毕业设计。 4、支持答疑:有问题可以...

    一种适用于随机检测的稳健性视频水印方法

    随机检测是视频水印需要解决的关键问题之一,目前的视频水印缺 乏有效的随机检测技术。对此,文中提出了一种适用于随机检测的稳健性视频水印方 法。该方法先将水印信号进行BCH编码并按密钥置换,然后将编码后的数据...

    swift-iOS视频拍摄视频滤镜视频水印

    本主题聚焦于使用Swift进行视频拍摄、视频滤镜应用以及视频水印添加的实践。在iOS中,这些功能通常涉及到AVFoundation框架、GPUImage库和其他相关技术。 一、视频拍摄 iOS设备内置了强大的多媒体支持,允许开发者...

Global site tag (gtag.js) - Google Analytics