Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 摄像机视频预览回调_Java_Android_Android Camera - Fatal编程技术网

Java 摄像机视频预览回调

Java 摄像机视频预览回调,java,android,android-camera,Java,Android,Android Camera,有人能给我提供使用PreviewCallback接口读取每帧相机视频的示例代码或示例吗 我希望在不使用surface的情况下获取帧,因为我希望摄像机视频的帧首先不显示在屏幕上,然后我可以将该帧传递给cocos2dx的CCLayer。这是一个缓慢的过程,无法处理传递到预览回调的每一帧数据。只有当您对实时预览应用程序的要求使您无法显示来自摄像头的视频或来自带有模板类型覆盖的摄像头的视频,并且您的显示器只能承受每秒几帧的延迟时,才应使用此选项 一些重要步骤: // decode Y, U, and V

有人能给我提供使用PreviewCallback接口读取每帧相机视频的示例代码或示例吗


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

这是一个缓慢的过程,无法处理传递到预览回调的每一帧数据。只有当您对实时预览应用程序的要求使您无法显示来自摄像头的视频或来自带有模板类型覆盖的摄像头的视频,并且您的显示器只能承受每秒几帧的延迟时,才应使用此选项

一些重要步骤

// 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; 
                } 
        } 
} 
Bitmap bitmap = BitmapFactory.decodeByteArray(out , 0, out.length);
  • 你们的活动必须延伸到地面支架,你们不应该开始 在创建曲面之前,请关闭摄影机
  • 预览仅支持每个设备上的特定大小(在我上次检查的设备上为480 x 320,这是在一段时间之前),但是 您的请求不会引起任何问题,只会被忽略。 当您最终收到预览回调时,请检查实际的 预览框架中的框架大小()
  • 发送到
    onPreviewFrame()
    byte[]
    数组数据位于YCbCr\u 422\u SP中 格式。没有其他格式可用,即使您尝试设置 他们。数据如下所述:
  • 不要尝试在
    onPreviewFrame()
    中解码数据。还不够 时间-如果您试图将系统保持在正常状态,您将使用软管连接摄像头 这项功能持续了这么长时间。将数据复制到您自己的缓冲区并 在单独的
    线程中解码
  • 线程运行时,您必须跳过对接收到的新帧的处理
    正在处理任何特定帧。等待
    线程
    完成后再执行 使用下一个可用帧中的数据
  • 解码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; 
                    } 
            } 
    } 
    
    Bitmap bitmap = BitmapFactory.decodeByteArray(out , 0, out.length);
    

    非常感谢您的回复。我可以不使用surface获得框架吗。实际上,我希望帧优先,而不向曲面显示任何内容,这样我就可以将帧发送到CCLayer来显示它。