之前已经有一篇博客讲过怎么开启摄像头并完成对摄像头的图像的滤镜化了,现在就说说怎么录像,并把这个添加滤镜的录像文件写到Path

原理是GPUImage给出了GPUImageMovieWriter这么个类,专门用于记录摄像头的录像。设定了路径和声音视频参数以后,把GPUImageMovieWriter的对象委托给滤镜对象,再把滤镜对象委托给VideoCamera就可以开始录制了。

首先定义:

    GPUImageMovieWriter * movieWriter;

    GPUImageVideoCamera * videoCamera;

    NSMutableDictionary * videoSettings;

    NSDictionary * audioSettings;

    NSString * pathToMovie;

这些都是录像必备的属性

接下来是初始化的工作

首先初始化声音和视频参数:

    //init Video Setting

    videoSettings = [[NSMutableDictionaryalloc] init];;

    [videoSettingssetObject:AVVideoCodecH264forKey:AVVideoCodecKey];

] forKey:AVVideoWidthKey];

] forKey:AVVideoHeightKey];

    

    //init audio setting

    AudioChannelLayout channelLayout;

    , sizeof(AudioChannelLayout));

    channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;

    

    audioSettings = [NSDictionarydictionaryWithObjectsAndKeys:

                                   [ NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,

                                   [ ], AVNumberOfChannelsKey,

                                   [ NSNumber numberWithFloat: 16000.0 ], AVSampleRateKey,

                                   [ NSData dataWithBytes:&channelLayout length: sizeof( AudioChannelLayout ) ], AVChannelLayoutKey,

                                   [ ], AVEncoderBitRateKey,

                                   nil];

然后是初始化文件路径和视频写入对象

    //init Movie path

    pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:thePath];

    unlink([pathToMovieUTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie

    NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];

    

    //init movieWriter

    movieWriter = [[GPUImageMovieWriteralloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0) fileType:AVFileTypeMPEG4outputSettings:videoSettings];

    

    [movieWritersetHasAudioTrack:YESaudioSettings:audioSettings];

接下来是GPUImageVideoCamera和滤镜效果的初始化,我就不写了,看我另外一篇博客

初始化的最后动作就是赋予委托:

    //把滤镜效果加给摄像头

    [videoCameraaddTarget:testFilter];

    //把摄像头上的图像给GPUImageView显示出来

    [testFilteraddTarget:imageView];

    [testFilteraddTarget:movieWriter];

这样初始化的工作就全部做完了,要开始录制只要开启以下代码:

        videoCamera.audioEncodingTarget = movieWriter;

        [movieWriterstartRecording];

就可以开始录制了,结束录制也很简单:

        //stop recording

        [testFilterremoveTarget:movieWriter];

        [movieWriterfinishRecording];

录制完的视频将会保存在路径里

 

还有两个小设置:

开启和关闭闪光灯:

        [videoCamera.inputCamerasetTorchMode:AVCaptureTorchModeOn];

        [videoCamera.inputCameraunlockForConfiguration];

        [videoCamera.inputCameralockForConfiguration:nil];

        [videoCamera.inputCamerasetTorchMode:AVCaptureTorchModeOff];

        [videoCamera.inputCameraunlockForConfiguration];

使用GPUImage开启的相机进行摄像,保存写入到Path的更多相关文章

  1. 在webapp上使用input:file, 指定capture属性调用默许相机,摄像,录音功能

    ## 在webapp上使用input:file, 指定capture属性调用默认相机,摄像,录音功能 在iOS6下开发webapp,使用inputz之file,很有用 <input type=& ...

  2. 用GPUImage开启相机并且开启滤镜效果

    GPUImage提供了GPUImageVideoCamera这么一个类,它的对象能够调用摄像头,并且加上滤镜的效果.     //init VideoCamera     //这里的两个参数可以设定拍 ...

  3. 导入GPUImage,实时滤镜相机,GUPImage遇到的问题解决,_OBJC_METACLASS_$_GBGPUImageView in GBGPUImageView.o

    导入方法转自:http://www.cnblogs.com/S2-huai/p/3881349.html.. (原文:http://www.cnblogs.com/YouXianMing/p/3709 ...

  4. RealSense R400系列深度相机的图像获取保存和格式转换

    关于RealSense的基础使用的博文用的库有点混杂,挺多博文都是早期maneger的那个库,对那个不是很了解,主要记录一下使用最新的函数库的基础使用. 相机型号:RealSense R435 使用函 ...

  5. 调用android系统相机拍照并保存

    [java] view plaincopyprint? <span style="font-size:18px;">package com.demo; import j ...

  6. android调用系统相机拍照并保存在本地

    import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...

  7. ## 在webapp上使用input:file, 指定capture属性调用默认相机,摄像,录音功能

    在iOS6下开发webapp,使用inputz之file,很有用 <input type="file" accept="image/*" capture= ...

  8. DevExpress asp.net 导出Excel 自动开启迅雷问题,默认保存为aspx页面

    目前采取曲线救国策略: 利用MVC ..... <dx:ASPxGridView ID="ASPxGridView1" runat="server" Au ...

  9. Android下 调用原生相机拍照摄像

    1 http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html 2 http://www.cnblogs.com/vir56k/ ...

随机推荐

  1. jQuery.each的function中有哪些参数(可以大概理解function中的参数问题)

    1.没有参数 $("img").each(function(){ $(this).toggleClass("example"); }); 1 2 3 2.有一个 ...

  2. 利用case when 减少表扫描次数

    数据库环境:SQL SERVER 2008R2 有网友希望有人帮他优化一下他的SQL,SQL语句如下: WITH T AS ( SELECT B.O_Money MON,B.O_States STAT ...

  3. 搭建golang的beego注意事项

    大家都知道,在学golang的时候,大家都会去关注谢大的beego快速开发架构. 首先,小弟是win7 32bit系统,在这里,我要把我学习golang的过程和小心得记录起来. 相信想学的人一定会早早 ...

  4. angularjs跨域调取webservice

    1.配置 web.config <webServices> <!--必须添加--> <protocols> <add name="HttpGet&q ...

  5. 【随记】还原SQL Server数据库步骤

    情景:在一台机器上备份数据库,然后在另一台机器上还原数据库,可能会出现错误提示:System.Data.SqlClient.SqlError: 备份集中的数据库备份与现有的 'XXX' 数据库不同. ...

  6. iPhone分辨率

    分辨率和像素 1.iPhone5           4"     分辨率320x568,像素640x1136,@2x 2.iPhone6           4.7"  分辨率3 ...

  7. servlet跳转jsp

    ackage com.monkey.servlet; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; im ...

  8. mongodb常用命令【转】

    mongodb由 C++编写,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-performance, ...

  9. Zoj 3868 GCD Expectation

    给一个集合,大小为n , 求所有子集的gcd 的期望和 . 期望的定义为 这个子集的最大公约数的K次方 : 每个元素被选中的概率是等可能的 即概率 p = (发生的事件数)/(总的事件数); 总的事件 ...

  10. 打log

    如果项目上过线的话,那你一定知道Log是多么重要. 为什么说Log重要呢?因为上线项目不允许你调试,你只能通过Log来分析问题.这时打一手好Log的重要性绝不亚于写一手好代码.项目出问题时,你要能拿出 ...