探索 GPUImage 音视频技术(6):架构总览

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

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

GPUImage 基于 OpenGL ES 2.0 管线模型,将「生成 → 处理 → 输出」拆成三大角色,全部以 GPU 纹理为数据载体,实现高性能、可组合、易扩展的图像 / 视频框架。

GPUImage 框架

1、三大核心角色

角色说明代表类 / 协议
Source产生图像帧(摄像头、图片、视频、裸数据)GPUImageVideoCameraGPUImageStillCameraGPUImagePicture
GPUImageMovieGPUImageRawDataInput
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

功能
GPUImageFilterShader 容器;管理片段着色器、参数暴露
GPUImageFilterGroup内部串联多个滤镜,对外保持单一输入 / 输出接口,减少 FBO 切换

内置滤镜分类(>100 种)

  • 色彩调整:亮度、对比度、饱和度…
  • 混合模式:Overlay、Screen、Multiply…
  • 视觉效果:像素化、旋涡、暗角…
  • 计算机视觉:边缘、角点检测…

3.3、Targets

功能
GPUImageViewUIView / NSOpenGLView 子类,把纹理画到屏幕
GPUImageMovieWriter把纹理编码为视频文件(含音频)
GPUImageRawDataOutput纹理 → CPU 可读的像素缓冲区

4、处理管线与数据流

  1. Frame Generation
    Source 产生帧 → 上传为 OpenGL 纹理
  2. Filter Processing
    纹理经 1-N 个 Shader 处理 → 输出到 FBO
  3. Target Rendering
    结果送显 / 写文件 / 回 CPU
探索 GPUImage 音视频技术(6):架构总览

5、Framebuffer 管理

作用
GPUImageFramebuffer封装纹理 + FBO
GPUImageFramebufferCache复用 FBO,避免频繁 alloc/free,降低内存峰值

6、自定义滤镜

只需两步:

  1. 继承 GPUImageFilter或其子类
  2. 提供 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、平台差异

维度iOSmacOS
摄像头GPUImageVideoCameraGPUImageStillCameraGPUImageAVCamera
视图GLKView派生NSOpenGLView派生
UI 集成UIKitAppKit
纹理尺寸旧机 2048×2048 上限(需分块)更大尺寸无限制

8、性能要点

  1. GPU 并行:像素级并行计算
  2. 异步处理:可选后台并发帧处理
  3. 资源池:Framebuffer 复用
  4. 链优化:FilterGroup 减少中间纹理拷贝

最佳实践

  • 用 GPUImageFilterGroup封装常用链
  • 避免在链中频繁改尺寸
  • 高分辨率或实时场景要评估滤镜复杂度
  • CPU 取像素尽量用 GPUImageRawDataOutput并异步

9、小结

  • 模块化:Source / Filter / Target 自由拼装
  • 高性能:GPU 并行 + Framebuffer 池
  • 跨平台:同一套管线,平台差异仅体现在输入输出
  • 易扩展:子类 + GLSL 即可新增滤镜

理解这套架构后,可轻松组合、裁剪、扩展 GPUImage,满足从简单滤镜到复杂视频管道的全部需求。

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

探索 GPUImage 音视频技术(6):架构总览

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

(0)

相关推荐

发表回复

登录后才能评论