1

伙计们,

在我的 Android 应用程序中,需要在 Canvas 视图上显示来自外部源的视频流。从我的 Java 代码中,我通过 JNI 将 ByteBuffer 传递给底层 C++ 库。该库对流进行解码并在 ByteBuffer 中构建一个 RGB 位图图像并将其返回。

现在,在我的 Java 代码中,我有一个 ByteBuffer,其中包含 RGB 值的宽度、高度和行。我现在可以在 for 循环中绘制它:

for(int y=0;y<height;y++) {
   for(int x=0;x<width;x++) {
       get the right RGB value from ByteBuffer and draw the pixel
   }
}

我想知道是否有更有效的方法来做到这一点?任何想法,将不胜感激。

ByteBuffer 数据的布局在我的控制之下。也许我可以重新安排它以获得更好的性能。

预先感谢您的帮助。

问候,
彼得

4

3 回答 3

0

阅读此 Android API“高效加载大型位图”官方指南。您将使用 BitmapFactory,这是一个专门为它制作的类,并且可能像其他 sdk 类一样以优化的方式进行。这里的链接:http: //developer.android.com/training/displaying-bitmaps/load-bitmap.html

于 2013-09-10T23:13:57.627 回答
0

前几天我能够修改这个问题的代码来解码 (Byte[3])RGB 流。它可能需要针对您的应用程序进行优化,但这是迄今为止我发现的最简单的方法。

Byte[] bytesImage = {0,1,2, 0,1,2, 0,1,2, 0,1,2};
int intByteCount = bytesImage.length;
int[] intColors = new int[intByteCount / 3];
int intWidth = 2;
int intHeight = 2;
final int intAlpha = 255;
if ((intByteCount / 3) != (intWidth * intHeight)) {
    throw new ArrayStoreException();
}
for (int intIndex = 0; intIndex < intByteCount - 2; intIndex = intIndex + 3) {
    intColors[intIndex / 3] = (intAlpha << 24) | (bytesImage[intIndex] << 16) | (bytesImage[intIndex + 1] << 8) | bytesImage[intIndex + 2];
}
Bitmap bmpImage = Bitmap.createBitmap(intColors, intWidth, intHeight, Bitmap.Config.ARGB_8888);
于 2013-09-11T01:40:51.713 回答
0

有效的方法是调用copyPixelsFromBuffer. 不要一个一个地绘制像素。您只需要操作 int 数组,并将它们绘制在一起。例如:

int[] data8888 = new int[N];
for (int i = 0; i < N; i++) {

        data8888[i] = 78255360;

        }
mBitmap.copyPixelsFromBuffer(makeBuffer(data8888, N));

private static IntBuffer makeBuffer(int[] src, int n) {

         IntBuffer dst = IntBuffer.allocate(n);

         for (int i = 0; i < n; i++) {

             dst.put(src[i]);

         }

         dst.rewind();

         return dst;

     }
于 2013-09-11T01:30:18.220 回答