探索 GPUImage 音视频技术(4):视频处理基础

这个系列文章我们来介绍一位海外工程师如何探索 GPUImage 音视频技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,本篇介绍 GPUImage 视频处理基础。

——来自公众号“关键帧Keyframe”的分享

GPUImage 通过 OpenGL ES Shader 在 GPU 上完成视频处理,性能远超 CPU。

iPhone 4 实例:Gamma 滤镜单帧耗时

  • GPUImage:2.5 ms
  • Core Image:106 ms
  • CPU:460 ms

1、视频管线模型

阶段作用
Source产生原始帧(摄像头、文件)
FilterGPU 处理帧(滤镜、特效)
Target接收结果(屏幕、文件、纹理)

可任意链式 / 分支,构建复杂管线。

2、输入源(Sources)

2.1、实时摄像头 GPUImageVideoCamera

GPUImageVideoCamera *videoCamera =
    [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480
                                        cameraPosition:AVCaptureDevicePositionBack];
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;

GPUImageFilter *filter = [[GPUImageSepiaFilter alloc] init];
GPUImageView *preview  = [[GPUImageView alloc] initWithFrame:CGRectMake(0,0,w,h)];

[videoCamera addTarget:filter];   // 摄像头 → 滤镜
[filter addTarget:preview];       // 滤镜 → 屏幕
[videoCamera startCameraCapture];

2.2、本地文件 GPUImageMovie

GPUImageMovie *movieFile = [[GPUImageMovie alloc] initWithURL:movieURL];
GPUImagePixellateFilter *pixFilter = [[GPUImagePixellateFilter alloc] init];

[movieFile addTarget:pixFilter];  // 文件 → 滤镜
[movieFile startProcessing];

3、输出目标(Targets)

3.1、实时预览 GPUImageView

见上方摄像头示例。

3.2、录制文件 GPUImageMovieWriter

NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Filtered.m4v"];
unlink([path UTF8String]);                      // 删除旧文件
NSURL *outURL    = [NSURL fileURLWithPath:path];

GPUImageMovieWriter *writer =
    [[GPUImageMovieWriter alloc] initWithMovieURL:outURL
                                            size:CGSizeMake(640,480)];

[filter addTarget:writer];                      // 滤镜 → 文件
[writer startRecording];

/* 处理结束回调内 */
[filter removeTarget:writer];
[writer finishRecording];                       // 必须调用,否则文件不完整

4、音频同步

4.1、文件处理

writer.shouldPassthroughAudio = YES;            // 透传音频
movieFile.audioEncodingTarget = writer;
[movieFile enableSynchronizedEncodingUsingMovieWriter:writer];

4.2、摄像头录音

videoCamera.audioEncodingTarget = writer;

5、滤镜链与复杂效果

5.1、链式叠加

GPUImageVideoCamera *cam = [[GPUImageVideoCamera alloc]
    initWithSessionPreset:AVCaptureSessionPreset720p
           cameraPosition:AVCaptureDevicePositionBack];
cam.outputImageOrientation = UIInterfaceOrientationPortrait;

GPUImageGrayscaleFilter *gray  = [[GPUImageGrayscaleFilter alloc] init];
GPUImageBoxBlurFilter   *blur  = [[GPUImageBoxBlurFilter alloc] init];
GPUImageSobelEdgeDetectionFilter *edge = [[GPUImageSobelEdgeDetectionFilter alloc] init];

[cam addTarget:gray];
[gray addTarget:blur];
[blur addTarget:edge];
[edge addTarget:preview];
[cam startCameraCapture];

管线:摄像头 → 灰度 → 模糊 → 边缘 → 屏幕。

6、分支处理:一源多滤镜

GPUImageVideoCamera *cam = [[GPUImageVideoCamera alloc]
    initWithSessionPreset:AVCaptureSessionPreset640x480
           cameraPosition:AVCaptureDevicePositionBack];

GPUImageSepiaFilter   *sepia   = [[GPUImageSepiaFilter alloc] init];
GPUImagePixellateFilter *pixel = [[GPUImagePixellateFilter alloc] init];

GPUImageView *sepiaView   = [[GPUImageView alloc] initWithFrame:CGRectMake(0,0,w/2,h)];
GPUImageView *pixelView   = [[GPUImageView alloc] initWithFrame:CGRectMake(w/2,0,w/2,h)];

[cam addTarget:sepia];
[cam addTarget:pixel];
[sepia addTarget:sepiaView];
[pixel addTarget:pixelView];
[cam startCameraCapture];

效果:左右分屏实时展示两种滤镜。

7、性能建议

因素建议
分辨率1080p → 720p 可大幅降低 GPU 负载
滤镜复杂度边缘检测、模糊等高耗时滤镜组合需实测帧率
设备差异iPhone 4S 可 720p@30 FPS,老机型需降级分辨率
链长度每增加一个滤镜即增加一帧延迟

8、官方示例速览

示例功能
SimpleVideoFilter实时可调像素化
SimpleVideoFileFilter文件 → 滤镜 → 保存
MultiViewFilterExample一源四滤镜分屏
ColorObjectTracking颜色实时追踪

以上示例位于仓库 examples/目录,可直接运行学习。

9、小结

  1. 核心模式:Source → Filter → Target
  2. 一行代码即可实现摄像头实时滤镜
  3. 链式 / 分支让复杂效果成为可能
  4. GPU 加速带来数十倍性能提升

掌握这些基础后,可继续深入自定义 Shader、OpenGL 混合等高级主题。

学习和提升音视频开发技术,推荐你加入我们的知识星球:【关键帧的音视频开发圈】

探索 GPUImage 音视频技术(4):视频处理基础

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至[email protected] 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论