在我们的视频编辑工具中,综合运用 ffmpeg 和 OpenGL ES 实现对图像和视频添加滤镜的功能。下面将对其核心逻辑以及相关代码进行详细阐释。
一、整体处理流程
当触发图像显示操作时,首要任务是判定图像的类型,即区分是视频还是图片。对于视频,需对其方向角实施调整并生成 FBO(帧缓冲对象)纹理;对于图片,则依据其显示区域获取相应的 FBO 纹理。随后,针对已获取的 FBO 纹理添加滤镜特效,并将处理后的数据存储至 FBO 中。最终,获取经过完整处理的 FBO 的 ID,借助展示 Filter 将其呈现在屏幕上。具体流程可参照下方的逻辑图:
二、关键处理步骤及代码解析
(一)图像方向处理
部分视频携带方向角,倘若不加以处理,显示方向将会出现偏差。VideoFilterControl::calculateMVPMatrix函数肩负着处理图像方向的重任,以确保其能够正常显示。
void VideoFilterControl::calculateMVPMatrix(int width, int height, int