第一部分:

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

Camera mCamera = Camera.open();

Camera.Parameters p = mCamera.getParameters();

p.setPreviewFormat(ImageFormat.NV21);

mCamera.setParameters(p);

mCamera.startPreview();

下面是解码核心部分:

@Override

publicvoidonPreviewFrame(byte[] data, Camera camera) {

Size size = camera.getParameters().getPreviewSize();

try{

YuvImage image = newYuvImage(data, ImageFormat.NV21, size.width, size.height,null);

if(image!=null){

ByteArrayOutputStream stream = newByteArrayOutputStream();

image.compressToJpeg(newRect(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 类。

第二部分:

原理是利用手机的摄像头取景,然后解码视频流

拆分成位图,然后对位图进行处理和识别

要在android手机里面捕获视频流

当然,手机必须得有摄像头

然后嘛,第一步是在AndroidManifest.xml加入如下权限声明

<permission android:name="android.permission.CAMERA">permission>

<uses-permission android:name="android.permission.CAMERA" />

<uses-feature android:name="android.hardware.camera" />

<uses-feature android:name="android.hardware.camera.autofocus" />

摄像头的预览和捕获只能通过surfaceview..

而且他的工作模式必须是SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS

不然不能在surfaceview里面显示出预览的图像

然后在surfaceCreated方法里面加入我们的摄像头初始化

public void surfaceCreated(SurfaceHolder arg0) {

//启动相机服务

mCamera = Camera.open();

Log.i("Camera", "surface open");

try {

//设置预览 这个holder是 SurfaceView的getHolder()方法得到的

mCamera.setPreviewDisplay(holder);

Camera.Parameters parameters = mCamera.getParameters();

//设置图片格式

parameters.setPictureFormat(PixelFormat.JPEG);

//设置预览的帧数,受硬件影响.

parameters.setPreviewFrameRate(10);

//设置尺寸

parameters.setPreviewSize(preV.getWidth(), preV.getHeight());

mCamera.setParameters(parameters);

//设置回调的类

mCamera.setPreviewCallback(new ViewCallback(preV, this));

//开始预览

mCamera.startPreview();

} catch (Exception e) {

//释放相机

mCamera.release();

mCamera = null;

return;

}

}

然后看看我们的ViewCallback类

在这个类里面要实现PreviewCallback

主要是里面的 public void onPreviewFrame(byte[] data, Camera arg1)

{}

data就是返回的数据流了, 不过麻烦的是这个流并不是rgb编码的,是YUV420SP编码的,

Camera.Parameters

里面有个setPreviewFormat() 这个虽然可以设置

但是具体能不能编码成JPEG是受你的手机影响的

其中的data是yuv格式的,需要对其解码:

static public void decodeYUV420SP(byte[]

rgbBuf, byte[] yuv420sp, int width, int height) {

final int

frameSize = width * height;

if (rgbBuf

== null)

throw new

NullPointerException("buffer 'rgbBuf' is null");

if

(rgbBuf.length < frameSize * 3)

throw new

IllegalArgumentException("buffer 'rgbBuf' size "

+ rgbBuf.length + " < minimum " + frameSize * 3);

if (yuv420sp

== null)

throw new NullPointerException("buffer

'yuv420sp' is null");

if

(yuv420sp.length < frameSize * 3 / 2)

throw new

IllegalArgumentException("buffer 'yuv420sp' size " +

yuv420sp.length

+ " < minimum " + frameSize * 3 / 2);

int i = 0, y = 0;

int uvp = 0, u = 0, v = 0;

int y1192 = 0, r = 0, g = 0, b = 0;

for (int j = 0, yp = 0; j < height; j++) {

uvp = frameSize + (j >> 1) * width;

u = 0;

v = 0;

for (i = 0; i < width; i++, yp++) {

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;

}

y1192 = 1192 * y;

安卓获取摄像头帧率_Android 关于获取摄像头帧数据相关推荐

  1. 安卓相机 高帧率_Android MediaCodec和摄像头:如何实现更高的帧速率从相机获取帧原始数据?...

    摄像机API有两个不同的参数用于控制帧速率: setPreviewFrameRate,它采用单帧速率值并且不推荐使用, setPreviewFpsRange采用一系列FPS值,是当前推荐的控制. 单F ...

  2. 安卓获取摄像头帧率_Android Camera预览时输出的帧率控制

    Android Camera预览时输出的帧率控制 2016年08月16日 14:24:28 阅读数:13250 如果使用MediaCodec硬编码H264,可以使用下面的方法控制编码输出的帧率: Me ...

  3. android获取网络时区_android 网络获取当前时区

    [转]Android配置文件权限一览表 转自:http://blog.csdn.net/kbest/article/details/7495154访问登记属性 android.permission.A ...

  4. android获取imei兼容_Android如何获取双卡手机IMEI的方法示例

    前言: 项目中有个统计付费广告转化率的需求,需要获取用户手机的IMEI.但是网上最常见的方法有坑,也就是TelephonyManager.getDeviceId(),这方法有可能获取的是MEID或者空 ...

  5. java 获取mp3 封面_android 怎样获取歌曲的专辑封面

    展开全部 该图片为使用如下代码解e5a48de588b662616964757a686964616f31333339666135析得到: 参考源码中,音乐目录: packages/apps/Music ...

  6. android获取imei兼容_Android中获取IMEI码的方法

    公共请求头 所有HTTP请求中,都包含如下公共请求头(HTTP Header): 名称 类型 是否必需 描述 Accept String 是 接受的返回类型,目前只支持JSON:application ...

  7. java 获取手机系统_Android系统信息获取

    Build.BOARD // 主板 Build.BRAND // 系统定制商 Build.SUPPORTED_ABIS //CPU指令集 Build.DEVICE // 设备参数 Build.DISP ...

  8. pyQT 视频播放器(三) 实现视频截图、获取每一帧数据

    pyQT 视频播放器(三) 实现视频截图.获取每一帧数据 背景 方法调研 详细代码说明 最终效果 总结: 参考资料 背景 在 "PyQt5 实现视频播放器(二) ,详细版本 ,适合新手入门& ...

  9. 安卓获取摄像头帧率_一种基于android终端提高USB2.0摄像头高分辨率高帧率的方法...

    一种基于android终端提高USB2.0摄像头高分辨率高帧率的方法 [技术领域] [0001 ]本发明涉及通讯技术领域,尤其涉及一种基于android终端提高USB2.0摄像头高分辨率高帧率的方法. ...

最新文章

  1. linux版的lcx
  2. Nginx 负载均衡配置和策略
  3. 计算机英语句子缩略,根据汉语意思完成英语句子,每空一词(含缩略形式)。 【1】-咋考网...
  4. ABAP Text表的实现原理
  5. 75. 颜色分类 golang
  6. react js 按条数 展开/折叠
  7. 飞鸽传书2007用户需求就是做好需求处理
  8. The Rise of Worse Is Better 论文-学习笔记
  9. java等边三角形代码_Java实现等边三角形--小程序,大思想
  10. sourceinsight安装记录
  11. 登陆界面网页代码_Opera Touch移动浏览器登陆iPad 并引入隐私浏览模式
  12. 基于javaweb+jsp的房屋租赁管理系统(java+SSM+Layui+Maven+Mysql+Jsp)
  13. 方向余弦矩阵与四元数
  14. 安卓设备投影到电脑PC端的简单实现
  15. html转微信公众号,通过htmlparse动态抓取微信公众号的文章
  16. 微分方程之一阶线性及可降阶方程
  17. c语言中除法与余数,带符号整数的除法与余数
  18. Opencv3.0-python: 编译报错color.cpp:7456: error: (-215) scn == 3
  19. python画一片树叶的故事_《Python数据分析与机器学习实战-唐宇迪》读书笔记第7章--决策树...
  20. 【无标题】profinet输入输出式分布式IP67总线IO模块

热门文章

  1. linux基本命令之文件浏览(cat,more,less,tail,head),文件操作命令(cp,mv,rm,find)
  2. 第十二章 SQL谓词 %INSET
  3. lm曲线公式推导_LM曲线-经典微观理论- 人大经济论坛-经管百科
  4. Shader山下(十一)纹理混合
  5. 哇!微软 Excel 竟然还能实现 CV 算法
  6. AWS之S3套CloudFront的CDN
  7. input标签怎么取消边框
  8. skyeye-基于layui的一套win10系列的OA系统
  9. 三点教会你怎么选购数据线
  10. HBase开发SQL查询中间件之查询原理