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