OpenGL 视频渲染导论:从图形管线到视频处理全览
本文从图形/图像渲染的学科背景出发,介绍 OpenGL 在该领域中的地位与应用场景,以及使用 OpenGL 进行视频渲染时涉及的相关领域知识。本文旨在为读者构建该领域的整体知识地图,为后续深入学习奠定基础。
一:图形渲染概述
1.1 渲染的定义
图形渲染是一个综合性的学科,维基百科对渲染的定义如下:
渲染(英语:render,rendering)又称彩现、绘制、算绘等,在电脑绘图中,是指以软件由模型生成图像的过程。模型是用语言或者数据结构进行严格定义的三维物体或虚拟场景的描述,它包括几何、视点、纹理、照明和阴影等信息。图像是数字图像或者位图图像。渲染用于描述:计算视频编辑软件中的效果,以生成最终视频的输出过程。三维计算机图形的预渲染(pre-rendering,offline rendering)或者实时渲染(real-time rendering,online rendering)的速度都非常慢。预渲染的计算强度很高,需要大量的服务器运算完成,通常被用于电影制作;实时渲染经常用于三维视频游戏,通常透过图形处理器(GPU)完成这个过程。
渲染是三维计算机图形学中的最重要的研究课题之一,并且在实践领域它与其它技术密切相关。在图形流水线中,渲染是最后一项重要步骤,通过它得到模型与动画最终显示效果。自从二十世纪七十年代以来,随着计算机图形的不断复杂化,渲染也成为一项越来越重要的技术。渲染的应用领域包含:计算机与视频游戏、模拟、电影或者电视特效以及可视化设计,每一种应用都是特性与技术的综合考虑。作为产品来看,现在已经有各种不同的渲染工具产品,有些集成到更大的建模或者动画包中,有些是独立产品,有些是开放源代码的产品。从内部来看,渲染工具都是根据各种学科理论,经过仔细设计的程序,其中有:光学、视觉感知、数学以及软件开发
1.2 渲染的分类
渲染的应用领域非常广泛。在手机、电脑等用户常见终端上,图像渲染的类型主要可分为:实时渲染(Real-time Rendering)、离线渲染(Offline Rendering)以及混合渲染等。
实时渲染(Real-time Rendering)的定义可以简要描述如下:
实时渲染是指在严格的时间约束内(通常 16.67ms/帧即 60fps,或 33.33ms/帧即 30fps)完成一帧图像的生成并输出到显示设备。其核心特征是交互性——用户输入能够立即反映到画面上。
实时渲染应用的行业众多,日常生活中接触到的游戏、汽车、仿真等领域都有实时渲染的身影。其核心目标是在保证最低可接受画质的前提下,尽可能快地生成图像,确保流畅的交互体验。
离线渲染(Offline Rendering)则与实时渲染形成鲜明对比:
- 核心目标:追求画质的物理真实感、光影精确度,不以交互时间为约束;
- 典型算法:路径追踪(Path Tracing)、光子映射(Photon Mapping)、辐射度算法(Radiosity)等全局光照技术;
- 代表工具:Pixar RenderMan、Arnold、V-Ray、Redshift、Octane Render 等;
- 典型应用:电影视觉特效、建筑可视化渲染、产品设计展示等;
- 计算特点:单帧渲染可能耗费数小时甚至数天,通常需要大量服务器组成渲染农场(Render Farm)并行计算。
1.3 图形渲染管线(Graphics Pipeline)
理解 GPU 渲染管线是学习 OpenGL 的核心基础。现代图形渲染管线的主要阶段如下:
顶点数据 → 顶点着色器(Vertex Shader)→ 图元装配 → 光栅化 → 片元着色器(Fragment Shader)→ 输出合并 → 帧缓冲| 阶段 | 说明 |
|---|---|
| 顶点着色器(Vertex Shader) | 对每个顶点执行坐标变换(如模型→世界→观察→裁剪空间)及法线变换等 |
| 图元装配(Primitive Assembly) | 将顶点组装为基本图元(点、线、三角形) |
| 光栅化(Rasterization) | 将图元离散化为屏幕空间的片元(Fragment)集合 |
| 片元着色器(Fragment Shader) | 对每个片元计算最终颜色值,是纹理采样、光照计算的核心阶段 |
| 输出合并(Output Merger) | 执行深度测试、模板测试、混合操作,将结果写入帧缓冲 |
OpenGL 从早期的固定管线(1.x)发展到可编程管线(2.0+),再到现代 OpenGL(3.3+/4.x Core Profile),开发者对管线的控制力逐步增强。当前推荐学习OpenGL 3.3+ Core Profile或OpenGL ES 3.0作为入门起点。
简单理解有3个阶段,应用程序阶段,几何阶段,光栅化阶段。几何阶段要做的包括模型的视图变化,顶点着色阶段,投影阶段,裁减阶段,屏幕映射阶段。光珊化阶段主要包括:三角形设定,三角形遍历,像素着色阶段,合并阶段。
1.4 底层图形 API 对比
实时渲染的底层技术栈主要包括:OpenGL、Vulkan、DirectX、Metal,以及它们的衍生版本。例如,OpenGL ES 和 WebGL 都是 OpenGL 在不同应用场景下的衍生技术,其底层实质仍是 OpenGL。
| API | 所属 | 设计特点 | 主要平台 |
|---|---|---|---|
| OpenGL / OpenGL ES | Khronos Group | 跨平台,高层抽象,易上手,驱动开销较大;ES 版本专为嵌入式设计 | 嵌入式、Android、Linux、Web(WebGL)、macOS(已弃用) |
| DirectX | Microsoft | 底层控制力强,驱动优化成熟,Windows 生态首选 | Windows、Xbox |
| Metal | Apple | 接近硬件底层,CPU/GPU 协同优化,Apple 平台性能最优 | iOS、macOS、tvOS、visionOS |
| Vulkan | Khronos Group | 显式 GPU 控制,极低驱动开销,跨平台,学习曲线最陡 | Windows、Linux、Android、Nintendo Switch |
API 选择建议:
- 跨平台优先(除 Apple)→OpenGL(入门)/Vulkan(进阶高性能)
- Windows 平台独占 →DirectX
- Apple 全平台 →Metal
- Android 优先 →OpenGL ES / Vulkan
1.5 上层引擎框架
基于这些图形 API 构建的集成软件框架中,比较著名的有Unity和UE(Unreal Engine)。它们内部封装了上述多种图形 API,开发者无需直接操作底层 API 即可完成图形渲染开发需求,例如制作游戏、车载 HMI 显示、数字孪生应用等。
本章小结:1:渲染分为实时与离线两大方向。OpenGL 是实时渲染中跨平台能力最广的 API 之一,掌握其核心——可编程渲染管线(Shader 编程)是后续学习的重中之重。上层框架(Unity/UE)封装了底层差异,但理解底层仍有助于性能调优和问题定位。2:学习完本章,你应该知道Opengl在渲染学中的位置,它主要在什么时候起作用,明白后续在渲染视频时为什么能使用这个图形API来干活。3:后续的介绍中我们主要关注opengl的渲染管线是如何工作的,在每一步都干了什么,在什么时候干哪个事情
二:OpenGL 的视频渲染应用
2.1 应用场景
OpenGL 既能渲染 2D/3D 图形,其中一个重要使用场景就是渲染视频以及显示 Camera 预览等。在移动端,这是实现实时滤镜、美颜、特效叠加等技术的基础。
2.2 EGL —— 连接 OpenGL 与窗口系统的桥梁
在 Android / 嵌入式平台,OpenGL 本身不涉及窗口管理,需要EGL(EGL Native Platform Graphics Interface)作为 OpenGL 与原生窗口系统(Native Window System)之间的桥接层。EGL 的核心职责包括:
- 创建渲染上下文(OpenGL Context),关联 OpenGL 状态机;
- 绑定 Surface(EGLSurface),将渲染目标与屏幕缓冲区关联;
- 管理帧同步(
eglSwapBuffers),实现双缓冲/三缓冲的帧提交。
EGL 的工作流程可概括为:获取 Display → 选择 Config → 创建 Context → 创建 Surface → 绑定 Context+Surface → 渲染循环 → 交换缓冲区。
2.3 Surface / SurfaceTexture 机制
Android 中Surface是图像生产者(Producer)和消费者(Consumer)之间的缓冲区队列:
- 生产者:Camera、MediaCodec、视频解码器等 —— 向 Surface 写入图像数据;
- 消费者:SurfaceFlinger、OpenGL 纹理等 —— 从 Surface 读取图像数据进行显示或处理。
SurfaceTexture是一个特殊的 Surface 消费者,它能将图像数据转换为 OpenGL 的OES 外部纹理(GL_TEXTURE_EXTERNAL_OES),从而将 Camera 预览流或视频解码帧直接输入 OpenGL 管线进行处理,无需 CPU 拷贝,实现高性能的 GPU 链路。
2.4 OpenGL 视频渲染的核心原理
使用 OpenGL 处理视频帧的本质流程如下:
视频帧(YUV 格式) │ ▼ 上传为 OpenGL 纹理(GL_TEXTURE_2D / OES Texture) │ ▼ Fragment Shader 中进行颜色空间转换(YUV → RGB 矩阵变换) │ ▼ 通过 FBO(Framebuffer Object)进行离屏渲染 │ ▼ 挂载新的 Shader 程序进行滤镜叠加(支持多 Pass 链式处理) │ ▼ 输出至 Surface 显示 / 编码器编码 / 保存为文件其中FBO(Framebuffer Object)是实现多 Pass 滤镜链的关键——每个 Pass 的输出作为下一个 Pass 的输入纹理,从而实现复杂的滤镜叠加效果。
2.5 常见视频滤镜类型
在 OpenGL 视频渲染场景中,常见的滤镜/后处理类型包括:
| 滤镜类型 | 说明 | 典型应用 |
|---|---|---|
| 色彩校正 | 通过 LUT(Look-Up Table)或 3D LUT 对图像色彩进行映射调整 | 电影调色、滤镜应用 |
| 美颜处理 | 磨皮(双边滤波/高反差保留)、大眼、瘦脸(网格变形) | 短视频、直播 |
| 特效叠加 | 转场动画、粒子特效、文字水印、贴纸 | 短视频、视频编辑 |
| 图像增强 | 锐化、降噪、超分辨率重建 | 图像预处理、画质优化 |
| 混合模式 | 叠加混合、柔光、透明度合成 | 图层合成、UI 叠加 |
2.6 渲染 Pipeline 总览
使用 OpenGL 进行图像渲染处理时,完整的 Pipeline 一般包括以下步骤:
- 获取图像流:从 Camera 获取流、从视频中解码流、或从服务器拉流;
- OpenGL 图像处理:使用 OpenGL 对图像流进行处理(滤镜、特效等);
- 后处理:处理完毕后保存为文件,或推送至编码器进行编码后推流。
本章小结:1:OpenGL 视频渲染的核心链路为EGL 创建上下文 → SurfaceTexture 接收帧 → OES 纹理上传 → Shader 做 YUV→RGB 转换 → FBO 离屏渲染 → 滤镜链叠加 → 最终输出。理解 FBO 多 Pass 机制和 Shader 颜色转换是掌握这一链路的关键。2:Opengl作为图形渲染底层API,主要作用是在渲染,但是在什么平台上的哪一个显示窗口并不关注,但是它抽象出来了EGL等相关概念,这些概念用来对接不同平台的显示窗口等,在开发时,你只需要在对应的平台上将这些对应的API设置完成,才能到达opengl的世界中进行绘制,也就是说使用Opengl绘制时的前提是配置好EGL这些参数,否则就无法启动渲染。
三:视频的相关领域知识
3.1 视频文件封装
我们常见的视频文件如 MP4,一般是视频与音频的综合载体——即可以理解为既有视频数据又有音频数据的二进制文件。通过播放器播放时,其中的画面内容和声音内容借助屏幕和扬声器等设备呈现出来,人就能看到图像、听到声音。
MP4 文件是压缩文件,即视频和音频经过压缩后封装在一起。除 MP4 外,常见的封装格式(容器)还包括:
| 封装格式 | 扩展名 | 特点 | 典型用途 |
|---|---|---|---|
| MP4 | .mp4 | 兼容性最好,现代播放器普遍支持 | 点播、本地存储 |
| MKV | .mkv | 开源,支持丰富元数据和多字幕/多音轨 | 影视存储 |
| FLV | .flv | 结构简单,延迟低 | 直播(RTMP 推流) |
| TS | .ts | 抗丢包,支持断点续播 | 直播(HLS 切片) |
| MOV | .mov | Apple 原生格式,质量高但体积大 | Apple 生态 |
| WebM | .webm | 面向 Web,开源免专利 | 网页视频嵌入 |
容器 vs 编码器:封装格式(容器)定义了视频/音频/字幕等轨道的组织方式,与编码格式(如 H.264、AAC)是独立的。同一个 MP4 文件可以包含 H.264 视频轨,也可以包含 H.265 视频轨。
3.2 视频基础参数
描述视频的基本参数包括分辨率、帧率和码率,三者关系密切:
- 分辨率(Resolution):每帧画面的像素数量,如 1920×1080、3840×2160(4K);
- 帧率(Frame Rate):每秒显示的帧数,如 30fps、60fps;
- 码率(Bitrate):每秒传输的比特数(bps),分为固定码率(CBR)和可变码率(VBR)。
三者近似关系:码率 ≈ 分辨率 × 帧率 × 压缩效率因子。同等分辨率和帧率下,编码器的压缩效率越高,所需码率越低,文件体积越小。
3.3 色彩格式:YUV 详解
视频在压缩前的原始格式是 YUV —— Camera 设备直出的就是 YUV 数据(Camera 直出的 Raw 数据需要经过 ISP 处理后才能转换为 YUV)。视频编解码器(Codec)通常也采用 YUV 格式进行编码,解码完成后输出的图像一般也是 YUV 格式。
YUV 各分量的含义:
| 分量 | 含义 | 说明 |
|---|---|---|
| Y | Luma(亮度) | 表示图像的明暗信息,单 Y 分量即为灰度图 |
| U(Cb) | Chroma Blue(蓝色色度分量) | 蓝色与亮度的偏差 |
| V(Cr) | Chroma Red(红色色度分量) | 红色与亮度的偏差 |
人眼对亮度(Y)敏感度远高于色度(U/V),因此可以采用色度采样(Chroma Subsampling)来压缩数据量:
| 采样格式 | 含义 | 数据量(相对于 4:4:4) | 应用场景 |
|---|---|---|---|
| 4:4:4 | 每个像素保留全部 U/V | 100% | 专业图像处理,无损存储 |
| 4:2:2 | 水平方向每 2 个 Y 共享 1 组 U/V | ~66% | 专业视频制作 |
| 4:2:0 | 水平和垂直方向每 4 个 Y(2×2区域)共享 1 组 U/V | ~50% | 消费级视频(最常见) |
常见的YUV 存储格式(4:2:0 采样下):
| 格式 | 排列方式 | 常见使用场景 |
|---|---|---|
| NV12 | Y 平面 + UV 交错平面(UVUV…) | 视频编码器输入(H.264/H.265) |
| NV21 | Y 平面 + VU 交错平面(VUVU…) | Android Camera 默认输出 |
| I420(YV12) | Y 平面 + U 平面 + V 平面 | 通用格式,软件处理常用 |
关键差异:NV12 和 NV21 的 UV 是交错存储(半平面),I420 的 U/V 是完全分离的三个平面。在 OpenGL 中通常将 Y 和 UV 分别作为两个纹理上传,在 Shader 中采样并转换。
3.4 色彩格式:RGB 与屏幕显示
视频在播放时需要在屏幕上显示,屏幕显示一般采用 RGB 格式的数据。RGB 简单理解就是分别用R(红色)、G(绿色)、B(蓝色)——光的三原色来呈现图像。在计算机中,光的三原色的显示范围通常为 0~255,但具体数值可能有所区别:
- SDR 视频:BT.709 色域下,RGB 范围可能是 0~255(Full Range)或 16~235(Limited Range);
- HDR 视频:DCI-P3 或 BT.2020 色域下,采用 10-bit 显示时,RGB 的范围为 0~1023。
YUV → RGB 转换:OpenGL Shader 中通过 3×3 颜色矩阵完成转换,不同色域标准(BT.601 / BT.709 / BT.2020)对应的转换矩阵不同,需要根据视频源正确选择,否则会出现色彩偏差。
3.5 色域(Color Gamut)
描述一个视频通常从色域和动态范围两个维度出发。
色域定义了设备所能表达的颜色范围。常见色域标准如下:
| 色域标准 | 别名 | 色域范围 | 主要应用 |
|---|---|---|---|
| sRGB / BT.601 | — | 较小(入门级) | 标清视频、Web 图像 |
| BT.709 | Rec.709 | 中等 | SDR 视频主流标准 |
| DCI-P3 | Display P3 | 较大(比 BT.709 大约 25%) | HDR 视频、Apple 设备 |
| BT.2020 | Rec.2020 | 最大(人眼接近范围) | UHD HDR 视频标准 |
3.6 动态范围(Dynamic Range)
视频按动态范围可分为:
- SDR(Standard Dynamic Range,标准动态范围):每通道 8-bit,记录 0~255 范围;
- HDR(High Dynamic Range,高动态范围):每通道 10-bit 或 12-bit,记录 0~1023 或 0~4095 范围。
两者在色彩还原能力上有本质区别——SDR 每个通道只能记录 0~255 种范围,而 HDR 每个通道能记录 0~1023 种范围,因此 HDR 视频的画面通常更接近真实场景。
HDR 的两种常见传输函数(Transfer Function):
- PQ(Perceptual Quantizer,感知量化):即 ST.2084,基于人眼视觉感知模型设计,用于 HDR10、Dolby Vision;
- HLG(Hybrid Log-Gamma,混合对数伽马):即 ARIB STD-B67,兼容 SDR 显示器,广泛用于广播电视 HDR。
3.7 HDR→SDR 色调映射(Tone Mapping)
原文遗留的问题:如果拍摄的视频本身采用 HDR 标准录制,那么 HDR 视频能否在只支持 SDR 的显示器上正常显示?
答案是:可以,但需要进行色调映射(Tone Mapping)。
HDR 内容的亮度范围(可达 1000~10000 nits)远超 SDR 显示器的显示能力(通常 100~300 nits)。Tone Mapping 的核心任务是将 HDR 的高动态范围压缩映射到 SDR 设备可显示的有限范围内,同时尽量保留画面的对比度、色彩饱和度和细节信息。
常见色调映射算法:
| 算法 | 特点 |
|---|---|
| Reinhard | 简单高效,基于全局亮度压缩,可能丢失高光细节 |
| ACES(Academy Color Encoding System) | 电影行业标准,色调映射曲线自然,色彩保真度高 |
| Hable(Uncharted 2) | 游戏行业常用的 Fitlm 曲线,对比度高、视觉效果好 |
| BT.2446 | ITU-R 建议的标准转换方法,用于 HDR→SDR 广播转换 |
3.8 视频编码标准
视频编码标准决定了视频的压缩效率和画质。主流的编码标准演进:
| 标准 | 发布年份 | 压缩率(相对前代) | 硬件支持 | 当前状态 |
|---|---|---|---|---|
| H.264(AVC) | 2003 | 基准 | 几乎所有设备 | 使用最广泛 |
| H.265(HEVC) | 2013 | 约 50% 提升 | 大部分现代设备 | 快速普及中 |
| AV1 | 2018 | 约 30% 提升(相对 HEVC) | 新设备支持 | 开源免费,Web 流媒体 |
| H.266(VVC) | 2020 | 约 50% 提升(相对 HEVC) | 早期支持 | 新兴标准 |
本章小结:1:视频领域知识围绕"从采集到显示"的链路展开——YUV(采集/编码)→ 编码标准(压缩)→ 封装容器(存储/传输)→ 解码 → YUV→RGB 转换 → 色域+动态范围(显示)。理解各环节的数据格式及转换关系,是整合 OpenGL + FFmpeg 进行视频处理的前提。2:渲染视频到屏幕上需要你知道视频的这些格式和内容限制标准,才能在渲染时,配置正确的参数,做到正确的显示,否则你将得不到预期的渲染效果
四:相关的开源技术库
4.1 核心工具库
在音视频领域的学习中,以下开源库是绕不开的重要工具:
FFmpeg
FFmpeg 是音视频领域最基础、最核心的开源库。它既可以作为命令行工具使用,利用其强大的命令行功能对视频、图像等进行操作;也可以作为动态库(.so)集成到代码中,实现编解码、解封装/封装、推流等功能。此外,ffprobe可以分析多媒体文件信息,ffplay可以直接播放视频,都是非常实用的功能。FFmpeg 底层编码依赖 libx264(H.264)、libx265(H.265)等编码库。
GStreamer
GStreamer 是面向视频处理的另一个开源框架,采用 Pipeline 式插件架构,通过连接不同元件(Element)构建处理管线。如果涉及流媒体服务器、视频会议系统这类应用场景,GStreamer 可能是更优先的选择。
OpenCV
OpenCV(Open Source Computer Vision Library)是计算机视觉领域的核心开源库。在视频处理场景中,OpenCV 常用于视频帧的读取、预处理(裁剪/缩放/旋转)、图像分析等任务,可与 OpenGL 搭配使用——OpenCV 做预处理,OpenGL 做实时渲染和滤镜。
4.2 移动端播放与渲染
ijkplayer
ijkplayer 是一款面向移动端的开源播放器,基于 FFmpeg 的 ffplay 二次开发,支持点播和直播。可以在移动端直接集成,用于播放本地视频、点播视频及直播流,可以理解为移动端的 ffplay。它支持自定义解码器和渲染器,可方便地接入 OpenGL 处理管线。
ExoPlayer
ExoPlayer 是 Google 官方的 Android 媒体播放器,是 Android 平台播放视频的首选方案。它支持 HLS、DASH、SmoothStreaming 等流媒体协议,并提供了灵活的自定义渲染器接口,允许开发者将视频帧输出到 OpenGL 中进行自定义处理后渲染。
GPUImage / Android-GPUImage
GPUImage 是基于 OpenGL(ES)的移动端图像/视频滤镜框架。它将各种滤镜封装为独立的 Filter 类,支持滤镜链式叠加,极大地降低了 OpenGL Shader 滤镜的开发门槛,适合快速实现美颜、调色等功能。
4.3 流媒体服务与数据处理
ZLMediaKit
ZLMediaKit 是一款高性能的开源流媒体服务器软件,主要用于安防等领域,支持 RTSP、RTMP、HLS、WebRTC 等多种协议,支持接收边缘设备的推流,以及向设备提供拉流观看直播等功能。同类替代方案还有SRS(Simple Realtime Server),同样广泛应用于直播和流转发场景。
libyuv
libyuv 是 Google 开源的 YUV 图像处理库,在 YUV 数据处理方面(缩放、旋转、格式转换、颜色空间转换等)性能优化到极致(利用 NEON/SSE/AVX 等 SIMD 指令集)。如果涉及 YUV 数据的处理,libyuv 是第一优先选择的开源库。
4.4 技术选型建议
根据不同的应用场景,推荐的技术选型如下:
| 应用场景 | 推荐方案 | 说明 |
|---|---|---|
| 个人学习 / 工具操作 | FFmpeg 命令行 | 功能全面,学习成本低 |
| Android 视频播放 | ExoPlayer + OpenGL 自定义渲染 | 官方方案,生态成熟 |
| 移动端滤镜应用 | GPUImage / 自研 OpenGL 管线 | GPUImage 快速原型,自研可深度定制 |
| 流媒体服务端 | ZLMediaKit / SRS | 高性能,社区活跃 |
| YUV 高性能处理 | libyuv | SIMD 优化,性能极致 |
| 视频会议 / 复杂管线 | GStreamer | Pipeline 架构灵活 |
| 图像预处理 / 分析 | OpenCV | 视觉算法丰富 |
| iOS 视频/滤镜 | GPUImage / Metal | Metal 是 Apple 平台性能最优选择 |
本章小结:FFmpeg 是音视频领域的事实标准工具链,libyuv 是 YUV 处理的性能首选,ZLMediaKit/SRS 是流媒体服务器的常用方案。移动端开发中,ExoPlayer + OpenGL 是 Android 视频处理的黄金组合,GPUImage 可加速滤镜开发。方案选择应基于具体场景(播放/滤镜/推流/会议)来做判断。
五:学习路线建议
作为导论篇的收尾,建议初学者按以下路径循序渐进:
第一阶段:基础概念 ├─ 理解渲染分类(实时 vs 离线) ├─ 理解图形渲染管线(Vertex Shader → Fragment Shader → 输出) ├─ 了解 YUV 与 RGB 的区别和关系 └─ 了解色域和动态范围的基本概念 第二阶段:OpenGL 基础 ├─ 学习 OpenGL ES 3.0 基础(顶点/片元 Shader、VBO、VAO) ├─ 掌握纹理映射和 FBO 离屏渲染 ├─ 在 Android 上搭建 OpenGL + SurfaceView 渲染环境 └─ 实践 YUV → RGB Shader 转换 第三阶段:Android 视频集成 ├─ 理解 EGL 的工作流程 ├─ 掌握 SurfaceTexture + OES Texture 机制 ├─ 实现 Camera 预览 + 滤镜 └─ 集成 MediaCodec 硬编/硬解 第四阶段:工具链与进阶 ├─ 学习 FFmpeg 常用命令和 API 集成 ├─ 实践视频解码 + OpenGL 渲染 + 滤镜 + 编码的完整链路 ├─ 了解主流编解码标准(H.264/H.265/AV1) ├─ 学习美颜算法原理(磨皮/大眼/瘦脸) └─ 了解流媒体协议(RTMP/HLS/WebRTC)和推拉流方案附录:术语对照表
| 英文 | 中文 | 简要说明 |
|---|---|---|
| API(Application Programming Interface) | 应用程序编程接口 | 软件组件之间交互的接口定义 |
| Bitrate | 码率 | 单位时间传输的比特数(bps) |
| CBR(Constant Bitrate) / VBR(Variable Bitrate) | 固定码率 / 可变码率 | 编码策略:恒定比特率 vs 动态比特率 |
| Chroma Subsampling | 色度采样 | 利用人眼对色度不敏感来压缩色彩数据 |
| Codec | 编解码器 | 视频/音频压缩(编码)与解压缩(解码) |
| Color Gamut | 色域 | 设备或标准所能表达的颜色范围 |
| Dynamic Range | 动态范围 | 最亮与最暗之间的亮度差异范围 |
| EGL | EGL 原生平台图形接口 | OpenGL 与原生窗口系统之间的桥接层 |
| FBO(Framebuffer Object) | 帧缓冲对象 | OpenGL 的离屏渲染目标 |
| FPS(Frames Per Second) | 每秒帧数 / 帧率 | 每秒显示的静态画面数量 |
| Fragment Shader | 片元着色器 | GPU 管线中负责像素着色的可编程阶段 |
| HDR(High Dynamic Range) | 高动态范围 | 10-bit+ 位深,更宽的亮度范围 |
| ISP(Image Signal Processor) | 图像信号处理器 | 将 Camera Sensor Raw 数据处理为 YUV/RGB |
| LUT(Look-Up Table) | 查找表 | 预计算的颜色映射表,用于快速色彩校正 |
| OES Texture(GL_TEXTURE_EXTERNAL_OES) | 外部纹理 | OpenGL ES 扩展,用于接收外部图像流 |
| Pixel / Fragment | 像素 / 片元 | 屏幕最小显示单元 / 光栅化后可着色的候选像素 |
| Resolution | 分辨率 | 图像的像素尺寸(如 1920×1080) |
| SDR(Standard Dynamic Range) | 标准动态范围 | 8-bit 位深,传统视频的动态范围 |
| Shader | 着色器 | GPU 上运行的小程序,控制渲染管线某阶段的行为 |
| SIMD(Single Instruction Multiple Data) | 单指令多数据 | CPU 的并行向量指令集(NEON/SSE/AVX) |
| Surface / SurfaceTexture | — | Android 图像缓冲队列,生产者-消费者模型 |
| Tone Mapping | 色调映射 | 将高动态范围映射到低动态范围的算法 |
| Vertex Shader | 顶点着色器 | GPU 管线中负责顶点坐标变换的可编程阶段 |