本文仅讲解putCameraStreamSurface在CENTER_INSIDE模式下实现自适应显示时的相机画面位置。其他模式均以铺满的形式占满整个视图。
CENTER_INSIDE是通过正交投影的形式实现自适应显示的,因此我们需要拿到视图的宽高和视频帧的宽高。
视图的宽高是由开发者自己决定的。如果全屏显示,那么此时宽高将会是屏幕的宽高。
视频帧的宽高可以使用ReceiveStreamListener获取。
这里是实现正交投影的代码:
public static void fillProjectionMatrix(
@NonNull float[] matrix, // length is 16
int frameWidth,
int frameHeight,
int surfaceWidth,
int surfaceHeight,
@NonNull ICameraStreamManager.ScaleType scaleType) {
if (matrix.length < 16) {
throw new IllegalArgumentException("The length of matrix must be greater than 16");
}
float aspectFrame = frameWidth / (float) frameHeight;
float aspectSurface = surfaceWidth / (float) surfaceHeight;
float left = -1;
float top = 1;
switch (scaleType) {
case CENTER_CROP:
if (aspectFrame > aspectSurface) {
left = -aspectSurface / aspectFrame;
} else {
top = 1 / aspectSurface * aspectFrame;
}
break;
case CENTER_INSIDE:
if (aspectFrame > aspectSurface) {
top = 1 / aspectSurface * aspectFrame;
} else {
left = -aspectSurface / aspectFrame;
}
break;
default:
break;
}
Matrix.orthoM(matrix, 0, left, -left, -top, top, 1, -1);
}
上述代码的含义是:
当视频流分辨率比例(宽/高)小于或等于视图比例,此时以视图中心为原点,视频流的宽所在范围是[视图比例/视频流分辨率,视图比例/视频流分辨率],高则是视图高度。
相反,当视频流分辨率比例(宽/高)大于视图比例,视频流的高所在范围是[1/(视图比例*视频流分辨率比例),1/(视图比例*视频流分辨率比例)],宽则是视图宽度。
通过上述比例可以推算出相机画面在视图中的位置。
评论
0 条评论
请登录写评论。