gpt4 book ai didi

android - TextureView Android 上的矩阵比例视频

转载 作者:太空宇宙 更新时间:2023-11-03 11:56:25 25 4
gpt4 key购买 nike

我正在尝试在 TextureView 上使用 ExoPlaye 播放视频。为了缩放和裁剪视频以适合 View ,我使用矩阵。我的自定义 View 扩展了“TextureView”这是我的代码:

@Override
public void onVideoSizeChanged(int width, int height, float pixelWidthHeightRatio) {
updateTextureViewSize(width, height);
Log.v("EXO", "onVideoSizeChanged() " + width + "x" + height);
}

private void updateTextureViewSize(float videoWidth, float videoHeight) {
float viewWidth = getWidth();
float viewHeight = getHeight();

float scaleX = 1.0f;
float scaleY = 1.0f;

float viewRatio = viewWidth / viewHeight;
float videoRatio = videoWidth / videoHeight;
if (viewRatio > videoRatio) {
// video is higher than view
scaleY = videoHeight / videoWidth;
} else {
//video is wider than view
scaleX = videoWidth / videoHeight;
}

Matrix matrix = new Matrix();
matrix.setScale(scaleX, scaleY, viewWidth / 2, viewHeight / 2);


setTransform(matrix);
}

我有一个矩形 View ,它工作得很好。但是现在 View 有 2 种状态:展开(旧 View 仍然是矩形)和折叠(高度较小。

所以现在视频在那些折叠的 View 中被垂直拉伸(stretch)。

例如,我有 View 1080x480 和视频 360x640 但看起来视频被缩放和裁剪为 1080x1080 而不是拉伸(stretch)为 1080x480

我在这里做错了什么?

UPD:以下是屏幕截图: enter image description here

最佳答案

接下来我通过将比例因子乘以或除以 viewRatio(width/height)解决了这个问题:

    if (viewRatio > videoRatio) {
// video is higher than view
scaleY = videoHeight / videoWidth * viewRatio;
} else {
//video is wider than view
scaleX = videoWidth / videoHeight / viewRatio;
}

但我不明白为什么会这样。根据我的计算,如果我有,例如, View 1080x480 和视频 360x640 视频应该缩放到宽度 x' = 1080 和高度成比例的。所以高度应该是 y' = 640*1080/360 (videoHeight * viewHeight/videoWidth) 和 x' = 1080

根据这张图片: enter image description here

sx * 360 = 1080 => sx = 1080/360

sy * 640 = 640*1080/360 => sy = 1080/360

看起来很有道理。如果我们需要保存比例,宽度和高度应该乘以相同的因子。但它不是这样工作的。哪里出错了?有什么好的文档吗?

关于android - TextureView Android 上的矩阵比例视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31567454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com