gpt4 book ai didi

java - 在 Android 上的 OpenGL 中绘制视频帧

转载 作者:搜寻专家 更新时间:2023-11-01 07:36:06 25 4
gpt4 key购买 nike

我目前正在开发一个通过 Android 上的 OpenGL ES 1.0 显示视频帧(作为位图)的系统。我的问题是我无法获得超过 10 fps 的帧率。

经过一些测试,我确定最大的瓶颈之一是位图的宽度和高度都需要是 2 的幂。例如,640x480 的视频必须放大到 1024x1024 .没有缩放,我已经能够获得大约 40-50fps,但纹理只是显示为白色,这对我没有好处。

我知道 OpenGL ES 2.0 支持使用两个纹理的非幂,但我没有使用着色器/2.0 中的任何其他新功能

有什么办法可以解决这个问题吗?与我所拥有的相比,其他视频播放如何获得如此出色的性能?我已经包含了一些代码以供引用。

private Bitmap makePowerOfTwo(Bitmap bitmap)
{
// If one of the bitmap's resolutions is not a power of two
if(!isPowerOfTwo(bitmap.getWidth()) || !isPowerOfTwo(bitmap.getHeight()))
{
int newWidth = nextPowerOfTwo(bitmap.getWidth());
int newHeight = nextPowerOfTwo(bitmap.getHeight());

// Generate a new bitmap which has the needed padding
return Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
}
else
{
return bitmap;
}
}

private static boolean isPowerOfTwo(int num)
{
// Check if a bitwise and of the number and itself minus one is zero
return (num & (num - 1)) == 0;
}

private static int nextPowerOfTwo(int num)
{
if(num <= 0)
{
return 0;
}

int nextPowerOfTwo = 1;

while(nextPowerOfTwo < num)
{
nextPowerOfTwo <<= 1; // Bitwise shift left one bit
}

return nextPowerOfTwo;
}

最佳答案

仅仅因为纹理必须是二的幂,并不意味着您的数据必须是二的幂。

您可以在使用 glTexImage 初始化期间自由创建 1024x1024(或 1024x512)纹理,使用 glTexSubImage 将位图数据填充到较低的 640x480,然后显示具有一些智能纹理坐标的较低 640x480 纹理 (0,0) 到 (640/1024, 480/1024)。纹理的其余部分将只包含从未见过的空白空间。

关于java - 在 Android 上的 OpenGL 中绘制视频帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11091215/

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