gpt4 book ai didi

java - 不同平台的不同代码(.java 文件)?

转载 作者:行者123 更新时间:2023-11-30 10:48:35 27 4
gpt4 key购买 nike

我有一个代码,其中图像数据从位图传递到 FFmpeg 帧记录器并转换为视频。但是我需要在华硕 zenfone 5(x86) 的 LG G3(armv7) 上运行它时进行小的更改。

以下是产生问题的类变量:(在 Main Activity 类下声明)

输入宽度 = 1024;

输入高度 = 650;

出现问题的方法如下:

 byte [] getNV21(int inputWidth, int inputHeight, Bitmap bitmap) {

int [] argb = new int[inputWidth * inputHeight];

bitmap.getPixels(argb, 0, inputWidth, 0, 0, inputWidth, inputHeight);

byte [] yuv = new byte[inputWidth*inputHeight*3/2];
encodeYUV420SP(yuv, argb, inputWidth, inputHeight);

return yuv;
}

void encodeYUV420SP(byte[] yuv420sp, int[] argb, int width, int height) {
final int frameSize = width * height;

int yIndex = 0;
int uvIndex = frameSize;

int a, R, G, B, Y, U, V;
int index = 0;
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {

a = (argb[index] & 0xff000000) >> 24; // a is not used obviously
R = (argb[index] & 0xff0000) >> 16;
G = (argb[index] & 0xff00) >> 8;
B = (argb[index] & 0xff) >> 0;

// well known RGB to YUV algorithm
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128;

// NV21 has a plane of Y and interleaved planes of VU each sampled by a factor of 2
// meaning for every 4 Y pixels there are 1 V and 1 U. Note the sampling is every other
// pixel AND every other scanline.
yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));
if (j % 2 == 0 && index % 2 == 0) {
yuv420sp[uvIndex++] = (byte)((V<0) ? 0 : ((V > 255) ? 255 : V));
yuv420sp[uvIndex++] = (byte)((U<0) ? 0 : ((U > 255) ? 255 : U));
}

index ++;
}
}
}

工作代码:

LG G3 :我可以在代码的任何地方使用上述变量来获得所需的输出。返回的位图大小 = 2734200

Asus Zenfone 5:除了创建位图,我必须在其他地方使用 bitmap.getHeight() 和 bitmap.getWidth(),以获得所需的输出。

令人惊讶的是这里返回的位图大小= 725760(所以它不是根据设置的位图参数设置的?)

错误代码:

LG G3:如果我使用 bitmap.getHeight() 和 bitmap.getWidth(),我会得到 java.lang.ArrayIndexOutOfBoundsException: length = 102354,index = 102354。@getNV21 方法

华硕 Zenfone 5:如果我使用 inputWidth 和 inputHeight,我会得到java.lang.IllegalArgumentException: x + width 必须是 <= bitmap.width() @getNV21 方法

我如何为两部手机概括上述代码?

最佳答案

在这种情况下,您可以使用 Strategy图案。

策略模式允许您在运行时根据您的环境更改算法。基本上你为你的策略定义了一个接口(interface)。像这样:

interface MyStrategy {
byte[] getNV21(int inputWidth, int inputHeight, Bitmap bitmap);
}

然后您对界面进行多种实现,一种用于 LG,一种用于华硕,例如,一种用于所有其他设备(设备中立):

class MyStrategyForLG implements MyStrategy {

public byte[] getNV21(int inputWidth, int inputHeight, Bitmap bitmap) {
// ...
}

}


class MyStrategyForAsus implements MyStrategy {

public byte[] getNV21(int inputWidth, int inputHeight, Bitmap bitmap) {
// ...
}

}


class DefaultMyStrategy implements MyStrategy {

public byte[] getNV21(int inputWidth, int inputHeight, Bitmap bitmap) {
// ...
}

}

您可以为 MyStrategy 创建一个工厂,这样您就可以避免在 MainActivity 中使用 if-else。像这样:

class MyStrategyFactory {

public void createMyStrategy() {
// ...
if ( deviceIsAsus ) {
return new MyStrategyForAsus();
}
if ( deviceIsLg ) {
return new MyStrategyForLG();
}
return new DefaultMyStrategy();
}
}

在您的 MainActivity 中,您可以像这样调用您的策略:

// ...
MyStrategy strategy = new MyStrategyFactory().createMyStrategy();
byte[] bytes = strategy.getNV21(width, height, image);
// ...

这种方法的好处是你在添加其他设备时不需要修改调用站点,例如当你注意到三星也有点奇怪时。相反,您实现 MyStrategyForSamsung 并更改工厂以在三星设备上执行代码时返回它。

关于java - 不同平台的不同代码(.java 文件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35755593/

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