这个系列文章我们来介绍一位海外工程师如何探索 GPUImage 音视频技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,本篇介绍 GPUImage 架构总览。
——来自公众号“关键帧Keyframe”的分享
GPUImage 基于 OpenGL ES 2.0 管线模型,将「生成 → 处理 → 输出」拆成三大角色,全部以 GPU 纹理为数据载体,实现高性能、可组合、易扩展的图像 / 视频框架。

1、三大核心角色
| 角色 | 说明 | 代表类 / 协议 |
|---|---|---|
| Source | 产生图像帧(摄像头、图片、视频、裸数据) | GPUImageVideoCameraGPUImageStillCameraGPUImagePictureGPUImageMovieGPUImageRawDataInput |
| Processing | 用 Shader 对纹理做像素级运算 | GPUImageFilterGPUImageFilterGroup |
| Target | 消费结果(显示、保存、回 CPU) | GPUImageViewGPUImageMovieWriterGPUImageRawDataOutput |
2、基类与协议
| 组件 | 职责 |
|---|---|
| GPUImageContext | 管理共享 OpenGL Context、Shader Program、Framebuffer 池 |
| GPUImageOutput | 所有 Source 的基类;负责注册 / 移除 target、通知新帧、协调处理顺序 |
| GPUImageInput协议 | 所有可接收帧的对象实现: – newFrameReadyAtTime:atIndex:– setInputFramebuffer:atIndex:– setInputSize:atIndex:– setInputRotation:atIndex: |
3、组件详解
3.1、Sources
| 类 | 功能 |
|---|---|
GPUImageVideoCamera | 实时摄像头视频 |
GPUImageStillCamera | 拍照 |
GPUImagePicture | 静态 UIImage / NSImage |
GPUImageMovie | 本地视频文件 |
GPUImageRawDataInput | 裸字节数组 → 纹理 |
3.2、Processing
| 类 | 功能 |
|---|---|
GPUImageFilter | Shader 容器;管理片段着色器、参数暴露 |
GPUImageFilterGroup | 内部串联多个滤镜,对外保持单一输入 / 输出接口,减少 FBO 切换 |
内置滤镜分类(>100 种)
- 色彩调整:亮度、对比度、饱和度…
- 混合模式:Overlay、Screen、Multiply…
- 视觉效果:像素化、旋涡、暗角…
- 计算机视觉:边缘、角点检测…
3.3、Targets
| 类 | 功能 |
|---|---|
GPUImageView | UIView / NSOpenGLView 子类,把纹理画到屏幕 |
GPUImageMovieWriter | 把纹理编码为视频文件(含音频) |
GPUImageRawDataOutput | 纹理 → CPU 可读的像素缓冲区 |
4、处理管线与数据流
- Frame Generation
Source 产生帧 → 上传为 OpenGL 纹理 - Filter Processing
纹理经 1-N 个 Shader 处理 → 输出到 FBO - Target Rendering
结果送显 / 写文件 / 回 CPU

5、Framebuffer 管理
| 类 | 作用 |
|---|---|
GPUImageFramebuffer | 封装纹理 + FBO |
GPUImageFramebufferCache | 复用 FBO,避免频繁 alloc/free,降低内存峰值 |
6、自定义滤镜
只需两步:
- 继承
GPUImageFilter或其子类 - 提供 GLSL 片段着色器 + 暴露属性
GPUImageFilter *custom = [[GPUImageFilter alloc]
initWithFragmentShaderFromString:@"
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
void main() {
lowp vec4 c = texture2D(inputImageTexture, textureCoordinate);
gl_FragColor = vec4(c.rgb + 0.1, c.a);
}
"];
7、平台差异
| 维度 | iOS | macOS |
|---|---|---|
| 摄像头 | GPUImageVideoCamera/ GPUImageStillCamera | GPUImageAVCamera |
| 视图 | GLKView派生 | NSOpenGLView派生 |
| UI 集成 | UIKit | AppKit |
| 纹理尺寸 | 旧机 2048×2048 上限(需分块) | 更大尺寸无限制 |
8、性能要点
- GPU 并行:像素级并行计算
- 异步处理:可选后台并发帧处理
- 资源池:Framebuffer 复用
- 链优化:FilterGroup 减少中间纹理拷贝
最佳实践
- 用
GPUImageFilterGroup封装常用链 - 避免在链中频繁改尺寸
- 高分辨率或实时场景要评估滤镜复杂度
- CPU 取像素尽量用
GPUImageRawDataOutput并异步
9、小结
- 模块化:Source / Filter / Target 自由拼装
- 高性能:GPU 并行 + Framebuffer 池
- 跨平台:同一套管线,平台差异仅体现在输入输出
- 易扩展:子类 + GLSL 即可新增滤镜
理解这套架构后,可轻松组合、裁剪、扩展 GPUImage,满足从简单滤镜到复杂视频管道的全部需求。
学习和提升音视频开发技术,推荐你加入我们的知识星球:【关键帧的音视频开发圈】

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