如何让Android视频动效变得超级炫酷?
摘要:在Android移动端视频处理领域,除了基本的播放功能外,添加动画和滤镜等特效已经成为提升用户体验的重要手段。然而,很多开发人员可能对于实现这些功能所需的技术细节感到困惑。因此,本文旨在提供一个详细的指导,帮助开发人员掌握如何使用开源Med
作者: vivo 互联网客户端团队- Xu Jie
在Android移动端视频处理领域,除了基本的播放功能外,添加动画和滤镜等特效已经成为提升用户体验的重要手段。然而,很多开发人员可能对于实现这些功能所需的技术细节感到困惑。因此,本文旨在提供一个详细的指导,帮助开发人员掌握如何使用开源MediaPlayer或自定义播放器,并利用OpenGL ES来实现视频动画和滤镜效果。
1分钟看图掌握核心观点👇
从事Android移动端开发的人员一定会跟动效打交道,并且对于常见的帧动画、属性动画使用起来更是得心应手,但是你一定也遇到一些问题,就是在做动效时,你能使用的资源无非就是图片、gif图或者PAG图,这些资源只能做简短、复杂度一般的效果,如果要做一个时间跨度较长并且动效要求较高的动效,这时候就需要借助视频来做了。
一、视频做动画,你可能无从下手
我们可以直接使用Mediaplayer、VideoView等开源播放器把UI设计师给我们的视频文件播放出来,一般情况下这样就够了。但是有一天UI设计师让你在视频的第50-100帧做些处理,视频画面做下抖动、放大等的处理,你可能会有些不知所措,这时候你的脑子里面可能有这些概念:
那么问题来了,究竟使用什么方案才能实现UI要求的效果?这个时候,你可能会deepseek或者找些技术博客去了解一下,不过结果无非是这样的,仍然是无法把应该具备的知识点串起来:
总之这时候的你,还是无从下手!
所以如果没有系统的了解,这时候就有可能使用错方案,达不到效果,比如你可能会想到是不是在原先的视频播放器窗口覆盖一层View,View动态显示截图的视频窗口图片,这种方案就是存在问题的。那么本文就是为了帮助梳理这些知识点,整理出了为了实现视频动效的完整实现流程,话不多说,先看实现结构图:
仔细看上面这张结构图,你的零散的知识点也许可以串联起来一些了,但是可能还不够全面!
结论先行,实现一个视频动画有两种方式:
实现方案1
直接使用开源的MediaPlayer播放器,然后利用OpenGL ES进行图形管线的接管与处理,对每一帧图片再去处理。优点是实现起来更加的方便,可以快速上手,但是缺点就是你只能对既有的视频帧做处理,没办法去修改视频帧底层的逻辑,虽然可以实现复杂的动效,但是仍然是受限的。
实现方案2
使用FFmpeg自己手撸一个播放器,要是实现简单动效,就借助原生的ANativeWindow,可以直接操作帧缓冲区(FrameBuffer),属于内存到屏幕的像素级拷贝,没有GPU的参与;或者使用GL介入,做视频纹理的管理,实现更加复杂的动效。这个实现方式缺点是比较复杂,但是最大的优点就是FFmpeg本身可以做到跨平台编译,不止是可以使用在Android,也可以使用在iOS平台。另外可以修改视频的更底层逻辑,满足更多的动效需求,比如类似抖音,有些特效都是可以做的。
两个方案有共同点,都需要OpenGL ES进行渲染视图,很多开发者只是了解这个概念,不清楚为什么要使用它,下面我们来彻底讲清楚。
二、初识OpenGL ES相关概念
OpenGL,全称是Open Graphics Library,译名:开放图形库或者“开放式图形库”,用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口(API)。OpenGL 跟语言和平台无关。OpenGL 纯粹专注于渲染,而不提供输入、音频以及窗口相关的 API。这些都有硬件和底层操作系统提供。OpenGL 的高效实现(利用了图形加速硬件)存在于 Windows,部分 UNIX 平台和 Mac OS,可以便捷利用显卡等设备。
也就是说,OpenGL就是绘制图形使用的,那么你的视频中播放的一帧帧图片,也是图形,所以你要是想做动画,也就是对图形做形变,就需要使用OpenGL帮你绘制出最终的图形。
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。经过多年发展,现在主要有两个版本,OpenGL ES 1.x 针对固定管线硬件的,OpenGL ES 2.x 针对可编程管线硬件。Android 2.2 开始支持 OpenGL ES 2.0,OpenGL ES 2.0 基于 OpenGL 2.0 实现。一般在 Android 系统上使用 OpenGL,都是使用 OpenGL ES 2.0,1.0 仅作了解即可。我们在Android开发中,使用的稳定版本,也都是ES 2.0。
2.1 坐标系的概念
作为一个Android移动端开发者。应该知道坐标系的概念,物体的位置都是通过坐标系确定的。
