GPUImage详细解析(五)滤镜视频录制

回顾

GPUImage的基础在详细解析1~4。 这次的介绍是录制视频添加滤镜保存到手机

核心思路

通过GPUImageVideoCamera采集视频和音频的信息,音频信息直接发送给GPUImageMovieWriter;视频信息传入响应链作为源头,渲染后的视频信息再写入GPUImageMovieWriter,同时通过GPUImageView显示在屏幕上。

具体细节

1、AV类

AVCaptureSession                *_captureSession;   协调AV输入设备到AVoutput的数据流
AVCaptureDevice                 *_inputCamera;      摄像头设备
AVCaptureDevice                 *_microphone;       麦克风设备
AVCaptureDeviceInput            *videoInput;        摄像头输入
AVCaptureVideoDataOutput        *videoOutput;       摄像头输出
AVCaptureDeviceInput            *audioInput;        麦克风输入
AVCaptureAudioDataOutput        *audioOutput;       麦克风输出
AVAssetWriter                   *assetWriter;       把多媒体数据写入文件的类
AVAssetWriterInput              *assetWriterAudioInput;  音频输入
AVAssetWriterInput              *assetWriterVideoInput;  视频输入
AVAssetWriterInputPixelBufferAdaptor     sh*assetWriterPixelBufferInput; 视频输入适配器

2、流程图

3、流程解析

1、找到物理设备摄像头_inputCamera、麦克风_microphone,创建摄像头输入videoInput和麦克风输入audioInput; 2、设置videoInput和audioInput为_captureSession的输入,同时设置videoOutput和audioOutput为_captureSession的输出,并且设置videoOutput和audioOutput的输出delegate; 3、_captureSession调用startRunning,开始捕获信号; 4、音频数据到达,把数据转发给之前设置的audioEncodingTarget,并通过调用assetWriterAudioInput的appendSampleBuffer方法写入音频数据; 5、视频数据到达,视频数据传入响应链,经过处理后通过assetWriterPixelBufferInput的appendSampleBuffer方法写入视频数据; 6、选择保存后,文件通过ALAssertLibrary写入手机照片库。

4、demo

  • 初始化
  // 摄像头
    _videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
    _videoCamera.outputImageOrientation = [UIApplication sharedApplication].statusBarOrientation;
    
  // 滤镜
    _filter = [[GPUImageSepiaFilter alloc] init];
    _filterView = [[GPUImageView alloc] initWithFrame:self.view.frame];
    self.view = _filterView;
    
  // 响应链
    [_videoCamera addTarget:_filter];
    [_filter addTarget:_filterView];
    [_videoCamera startCameraCapture];
  • 开始录制
        unlink([pathToMovie UTF8String]); // 如果已经存在文件,AVAssetWriter会有异常,删除旧文件
        _movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];
        _movieWriter.encodingLiveVideo = YES;
        [_filter addTarget:_movieWriter];
        _videoCamera.audioEncodingTarget = _movieWriter;
        [_movieWriter startRecording];
  • 结束录制
        [_filter removeTarget:_movieWriter];
        _videoCamera.audioEncodingTarget = nil;
        [_movieWriter finishRecording];

录制后的视频如下:

系统手机库中的视频:

思考

1、在流程图的环节中,哪一步给视频信息添加了滤镜? 2、为何视频的写入类比音频写入类多了一个类?

总结

核心类是GPUImageMovieWriter,协调音频和视频信息的写入。

  • 思考题答案

1、GPUImageVideoCamera把摄像头采集的YUV视频帧,转换为RGB视频帧,同时作为响应链的起始点;GPUImageMovieWriter实现了GPUImageInput协议,可作为响应链的终点,接受滤镜处理过的视频信息。 2、AVAssetWriterInputPixelBufferAdaptor类提供了CVPixelBufferPool用来更快的分配缓存。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序人生

Let it crash: 因为误解,所以瞎说

今天我知乎的时间线上反复出现了一个流毒甚广的帖子:「应该如何理解Erlang的“就让它崩溃”思想?」,十几个不懂装懂的回答,赞竟然都不少。 严格意义上来说,我之...

3757
来自专栏跨界架构师

过去这几十年,分布式系统的「数据一致性」精华都在这了!

        本文是本系列的第三篇。与前两篇《分布式系统关注点——数据一致性(上篇)》、《分布式系统关注点——通过“共识”达成数据一致性》形成完整的「数据一致...

1661
来自专栏搜云库

防守式编程的艺术

原文地址:The Art of Defensive Programming 防守式编程的艺术 为什么开发人员不编写安全代码? 我们不再在这里讨论 “干净的代码”...

2049
来自专栏腾讯Bugly的专栏

【团队分享】苍翼之刃:论File Descriptor泄漏如何导致Crash?

这一期的团队分享,我们特邀苍翼之刃的开发负责人Jay,为大家分享在Android项目中遇到的一些Crash。 苍翼之刃 外文:BlazBlue Revolut...

5717
来自专栏牛客网

成都-阿里Java研发工程师面经

11号去成都参加阿里面试,网上预约的3点,两点半就到了,刚签完到马上就喊去面试。经历了一面二面和HR面。 一面 1.介绍一下你的项目,说一下哪个项目印象最深 ...

4358
来自专栏GIS讲堂

Arcgis for Javascript之统计图的实现

如上图所示,一般的涉及到的地图的统计涉及到上述所展示的三个状态:1、初始化状态;2、缩放后的状态;3、点击选中显示详情状态。第一种状态下,加载统计图,一般来说,...

1941
来自专栏康怀帅的专栏

Mac OS X 背后的故事(下)

Mac OS X 背后的故事(九)半导体的丰收 半导体的丰收(上)   在美国宾夕法尼亚州的东部,有一个风景秀美的城市叫费城。在这个城市诞生了一系列改变世界的奇...

4727
来自专栏Android中高级开发

Android开发之漫漫长途 XVI——ListView与RecyclerView项目实战

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

731
来自专栏极乐技术社区

『教程』来自小程序开发者的实例教程

最近由马伊琍、靳东男神主演的《我的前半生》火到不行,剧中人物的爱恨纠葛,简直让大批剧迷深陷其中,不能自拔!而女主人公罗子君的前半生,更让剧迷们操碎了心。 就没人...

2688
来自专栏ThoughtWorks

ArchUnit,架构守护神 | 雷达哔哔哔

ArchUnit是一个基于 Java 的测试库,用于检查代码的结构特性,如包和类的依赖关系、注解验证,甚至还能检查代码分层是否一致。我们很喜欢 ArchUnit...

3242

扫码关注云+社区

领取腾讯云代金券