gpt4 book ai didi

java - 相机视频的预览回调

转载 作者:行者123 更新时间:2023-12-01 14:43:08 25 4
gpt4 key购买 nike

有人可以向我提供使用 PreviewCallback 接口(interface)读取相机视频的每一帧的示例代码或示例吗?

我想在不使用surface的情况下获取帧,因为我想要首先将相机视频的帧不显示在屏幕上,然后我可以将该帧传递给cocos2dx的CCLayer。

最佳答案

这是一个缓慢的过程,无法处理传递到预览回调的每一帧数据。仅当您对实时预览应用程序的要求使得无法显示来自摄像机的视频或来自带有模板类型覆盖层的摄像机的视频,并且您的显示器只能容忍每个帧几帧时才应使用它。第二个有一些延迟。

一些重要步骤:

  1. 您的 Activity 必须扩展 Surface Holder,并且您不应该启动相机,直到创建表面。
  2. 预览版仅支持每台设备上的特定尺寸(我检查过的最后一台设备 - 不久前为 480 x 320),但是您的请求不会造成任何问题,只会被忽略。当您最终收到预览回调时,请检查实际情况onPreviewFrame() 中的帧大小。
  3. 发送到 onPreviewFrame()byte[] 数组数据位于 YCbCr_422_SP 中格式。即使您尝试设置,也没有其他格式可用他们。数据描述如下:http://groups.google.com/group/android-developers/msg/d3b29d3ddc8abf9b
  4. 不要尝试解码 onPreviewFrame() 中的数据。还不够时间 - 如果您尝试将系统举起,您将用软管冲洗相机这个功能用了这么久。将数据复制到您自己的缓冲区并在单独的线程中解码。
  5. 您必须跳过对线程期间收到的新帧的处理正在处理任何特定的帧。等到Thread完成之前使用下一个可用帧中的数据。

解码 YUV 预览数据:

// decode Y, U, and V values on the YUV 420 buffer 
// described as YCbCr_422_SP by Android - David Manpearl
public static void decodeYUV(int[] out, byte[] fg, int width, int
height) throws NullPointerException, IllegalArgumentException {
final int sz = width * height;
if(out == null) throw new NullPointerException("buffer 'out' is null");
if(out.length < sz) throw new IllegalArgumentException("buffer 'out' size " + out.length + " < minimum " + sz);
if(fg == null) throw new NullPointerException("buffer 'fg' is null");
if(fg.length < sz) throw new IllegalArgumentException("buffer 'fg' size " + fg.length + " < minimum " + sz * 3/ 2);
int i, j;
int Y, Cr = 0, Cb = 0;
for(j = 0; j < height; j++) {
int pixPtr = j * width;
final int jDiv2 = j >> 1;
for(i = 0; i < width; i++) {
Y = fg[pixPtr]; if(Y < 0) Y += 255;
if((i & 0x1) != 1) {
final int cOff = sz + jDiv2 * width + (i >> 1) * 2;
Cb = fg[cOff];
if(Cb < 0) Cb += 127; else Cb -= 128;
Cr = fg[cOff + 1];
if(Cr < 0) Cr += 127; else Cr -= 128;
}
int R = Y + Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5);
if(R < 0) R = 0; else if(R > 255) R = 255;
int G = Y - (Cb >> 2) + (Cb >> 4) + (Cb >> 5) - (Cr >> 1) + (Cr >> 3) + (Cr >> 4) + (Cr >> 5);
if(G < 0) G = 0; else if(G > 255) G = 255;
int B = Y + Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6);
if(B < 0) B = 0; else if(B > 255) B = 255;
out[pixPtr++] = 0xff000000 + (B << 16) + (G << 8) + R;
}
}
}

byte[]数组转换为位图:

Bitmap bitmap = BitmapFactory.decodeByteArray(out , 0, out.length);

关于java - 相机视频的预览回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15738554/

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