Android -- 获取摄像头帧数据解码

由于Android下摄像头预览数据只能  ImageFormat.NV21 格式的,所以解码时要经过一翻周折.

Camera mCamera = Camera.open();

Camera.Parameters p = mCamera.getParameters();

p.setPreviewFormat(ImageFormat.NV21);

/*这是唯一值,也可以不设置。有些同学可能设置成 PixelFormat 下面的一个值,其实是不对的,具体的可以看官方文档*/

mCamera.setParameters(p);

mCamera.startPreview();

下面是解码核心部分:

@Override
  public void onPreviewFrame(byte[] data, Camera camera) {
      Size size = camera.getParameters().getPreviewSize();
      try{
          YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
          if(image!=null){
              ByteArrayOutputStream stream = new ByteArrayOutputStream();
              image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
              Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());

                   stream.close();
          }
      }catch(Exception ex){
          Log.e("Sys","Error:"+ex.getMessage());
      }
  }

代码很简单。就是把YUV数据转成 Bitmap 就行了,系统提供 YuvImage 类。

yuv420sp转RGB                                                                       

/**
         * 解码
         *
         * @param rgb
         * @param yuv420sp
         * @param width
         * @param height
         */
        static public void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
                final int frameSize = width * height;

                for (int j = 0, yp = 0; j < height; j++) {
                        int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
                        for (int i = 0; i < width; i++, yp++) {
                                int y = (0xff & ((int) yuv420sp[yp])) - 16;
                                if (y < 0)
                                        y = 0;
                                if ((i & 1) == 0) {
                                        v = (0xff & yuv420sp[uvp++]) - 128;
                                        u = (0xff & yuv420sp[uvp++]) - 128;
                                }

                                int y1192 = 1192 * y;
                                int r = (y1192 + 1634 * v);
                                int g = (y1192 - 833 * v - 400 * u);
                                int b = (y1192 + 2066 * u);

                                if (r < 0)
                                        r = 0;
                                else if (r > 262143)
                                        r = 262143;
                                if (g < 0)
                                        g = 0;
                                else if (g > 262143)
                                        g = 262143;
                                if (b < 0)
                                        b = 0;
                                else if (b > 262143)
                                        b = 262143;

                                rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
                        }
                }
        }

我是天王盖地虎的分割线                                                                 

Android -- 获取摄像头帧数据解码,布布扣,bubuko.com

时间: 2024-08-26 07:13:52

Android -- 获取摄像头帧数据解码的相关文章

Android 关于获取摄像头帧数据解码

// 创建保存照片文件夹 private void CreateFileJPG() { File file = new File("/sdcard/image"); if (!file.exists()) { try { file.mkdirs(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } /** * 拍照保存图片 * */ public void saveMyBitmap

WebSocket帧数据 解码/转码

数据从浏览器通过websocket发送给服务器的数据,是原始的帧数据,默认是被掩码处理过的,所以需要对其利用掩码进行解码. 从服务器发送给浏览器的数据是默认没有掩码处理的,只要符合一定结构就可以了.具体可以参考websocket的RFC文档 http://www.rfcreader.com/#rfc6455 The threat model being protected against is one in which the client sends data that appears to

android获取某应用的帧数据

android获取某应用的帧数据: 说明: (打开手机 开发者选项-GPU显示配置文件(显示于 adb shell dumpsys gfxinfo)勾上,只有4.1以上支持) 在android4.1中,谷歌提供了一个工具来,叫做" GPU呈现模式分析(Profile GPU rendering)", 在开启这个功能后,系统就会记录保留每个界面最后128帧图像绘制的相关时间信息 开始操作: 命令行 adb shell dumpsys gfxinfo com.taobao.mobile.d

Android获取前置摄像头实现静默拍照

Android获取前置摄像头静默拍照 在实现入侵警报功能时需要获取系统前置摄像头实现后台静默拍照,并将数据存储到数据库中以备用户查看.具体步骤如下: 1.获取使用相机权限 ActivityCompat.requestPermissions(SomeActivity.this,new String[]{Manifest.permission.CAMERA},1); 2.在拍照所在activity对应的xml文件中添加宽高为0.1dp的SurfaceView <SurfaceView app:lay

RTSP播放器网页web无插件直播流媒体音视频播放器EasyPlayer-RTSP-Android解码获取视频帧的方法

应用场景 EasyPlayer-RTSP在多年与VLC的对标过程中,积累了广泛的应用场景,EasyPlayer-RTSP底层与上层全部自主开发,自主知识产权,可实战测试. EasyPlayer-RTSP播放器 EasyPlayer-RTSP播放器是一套RTSP专用的播放器,包括有:Windows(支持IE插件,npapi插件).Android.iOS三个平台,是由青犀TSINGSEE开放平台开发和维护的区别于市面上大部分的通用播放器,EasyPlayer-RTSP系列从2014年初发展至今得到了

直接获取摄像头传回的图像数据(人脸、微笑、眨眼: 识别--&gt;第一步):图像识别第一步

转:ios通过摄像头获取特定数据 文字太小可通过command '+'调大字体,温馨提示. 注释: 由于最近项目需求,需要一个能够实现对摄像头图片获取其中部分内容的功能,类似于二维码扫描.但是只需要获取特定位置的像素块进行简单计算即可,所以听上去还是很简单的,但是经过实践,发现,现实似乎与想象中不一样,由于摄像头拍到的数据,采用的是QZ(也就是CG框架)进行绘制,所以涉及到坐标系与frame的坐标系不一致的问题. 1:尝试直接拿到摄像头数据,先输出看下. code: 代码略. 总结: 直接使用摄

FFmpeg获取DirectShow设备数据(摄像头,录屏)

这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1.       列设备 ffmpeg -list_devices true -f dshow -i dummy 命令执行后输出的结果如下(注:中文的设备会出现乱码的情况).列表显示设备的名称很重要,输入的时候都是使用"-f dshow -i video="{设备名}""的方式. 我自己的机器上列出了以下设备: [dshow @0

opencv+qt+beaglebone 之获取摄像头数据。

最近在研究opencv. 把opencv获取摄像头数据调试成功. 一个简单的测试代码 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLabel> #include <QGridLayout> #include <QPushButton> #include <QComboBox> #include <QImage

android客户端和网站数据交互的实现(基于Http协议获取数据方法)

android客户端一般不直接访问网站数据库,而是像浏览器一样发送get或者post请求,然后网站返回客户端能理解的数据格式,客户端解析这些数据,显示在界面上,常用的数据格式是xml和json. 可以理解客户端其实是一个你自己定义标记语言的浏览器,一般浏览器能解析的是html+css的数据,而android客户端能解析的是xml和json(或者都不是而是你自己定义的火星格式),服务端为了能满足客户端输出这种数据格式的需求,不得不专门针对客户端开发不同于浏览器访问的接口. 开发一个网站的客户端你需