GPUImage-滤镜视频录制

核心思路

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

GPUImage-滤镜视频录制_第1张图片

具体细节

1、AV类

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

2、流程图

GPUImage-滤镜视频录制_第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 = [[GPUImageVideoCameraalloc] initWithSessionPreset:AVCaptureSessionPreset640x480cameraPosition:AVCaptureDevicePositionBack]; _videoCamera.outputImageOrientation= [UIApplicationsharedApplication].statusBarOrientation;// 滤镜_filter = [[GPUImageSepiaFilteralloc] init]; _filterView = [[GPUImageViewalloc] initWithFrame:self.view.frame];self.view= _filterView;// 响应链[_videoCamera addTarget:_filter]; [_filter addTarget:_filterView]; [_videoCamera startCameraCapture];

开始录制

unlink([pathToMovie UTF8String]);// 如果已经存在文件,AVAssetWriter会有异常,删除旧文件_movieWriter = [[GPUImageMovieWriteralloc] initWithMovieURL:movieURL size:CGSizeMake(480.0,640.0)];    _movieWriter.encodingLiveVideo=YES;    [_filter addTarget:_movieWriter];    _videoCamera.audioEncodingTarget= _movieWriter;    [_movieWriter startRecording];

结束录制

[_filterremoveTarget:_movieWriter];_videoCamera.audioEncodingTarget = nil;[_movieWriterfinishRecording];

录制后的视频如下:

系统手机库中的视频:

思考

1、在流程图的环节中,哪一步给视频信息添加了滤镜?

2、为何视频的写入类比音频写入类多了一个类?

总结

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

文/落影loyinglin(作者)

原文链接:http://www.jianshu.com/p/4701d006b514/comments/2862389

著作权归作者所有,转载请联系作者获得授权,并标注“作者”。

你可能感兴趣的:(GPUImage-滤镜视频录制)