首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GPUImage详细解析(五)滤镜视频录制

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

作者头像
落影
发布2018-04-27 16:27:56
1.8K0
发布2018-04-27 16:27:56
举报
文章被收录于专栏:落影的专栏落影的专栏

回顾

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用来更快的分配缓存。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.06.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 回顾
  • 核心思路
  • 具体细节
    • 1、AV类
      • 2、流程图
        • 3、流程解析
          • 4、demo
          • 思考
          • 总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档