Android FFMPEG-播放器画面适配
单位矩阵
在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵。它是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。除此以外全都为0。
根据单位矩阵的特点,任何矩阵与单位矩阵相乘都等于本身,而且单位矩阵因此独特性在高等数学中也有广泛应用。
假设A 是矩阵 或者向量| 1 0 0 0 | | 0 1 0 0 | A * | 0 0 1 0 | = A | 0 0 0 1 |
利用这个单位矩阵 我们OpenGL 中的 顶点坐标 是 4维向量 如果 跟这个矩阵 进行相乘计算
attribute vec4 av_Position; (x, y, z, w)
改变对角线的值 跟我们的这个4维向量乘法, 其实就可以对x,y 的坐标 进行处理
| x*s_x | | s_x 0 0 0 | | x || y*s_y | = | 0 s_y 0 0 | * | y || z*s_z | | 0 0 s_z 0 | | z || 1 | | 0 0 0 1 | | 1 |
openGL 中如何增加矩阵
我们可以在顶点shader 中增加一个变量用来传入矩阵的值
attribute vec4 av_Position; attribute vec2 af_Position; varying vec2 v_texPosition; uniform mat4 u_Matrix; //mat4 代表 4x4 的矩阵 void main() {v_texPosition = af_Position;gl_Position = av_Position * u_Matrix; //在这里 opengl 会进行矩阵计算 }
所以我们只需要根据视频的尺寸 计算出对应的矩阵就可以 , openGl 提供这样的api (正交投影矩阵)
android.opengl.Matrix.orthoM(float[] m, int mOffset,float left, float right, float bottom, float top,float near, float far)
这里的 left right top bottom 是定义了一个视景体的一个范围 , near 和 far 是近平面 和远平面到视点的距离
假如我们left right top bottom 传入 -2f, 2f , -2f, 2f , 那么 我们的顶点范围经过矩阵计算就变成在中心画面的一半区域 。相当于上下左右 都缩小了一半
更多详情哔哩哔哩_bilibili
有想学习 音视频相关的兄弟可以去看一下哔哩哔哩_bilibili