安卓获取摄像头帧率_Android 关于获取摄像头帧数据
第一部分:
由于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 关于获取摄像头帧数据相关推荐
- 安卓相机 高帧率_Android MediaCodec和摄像头:如何实现更高的帧速率从相机获取帧原始数据?...
摄像机API有两个不同的参数用于控制帧速率: setPreviewFrameRate,它采用单帧速率值并且不推荐使用, setPreviewFpsRange采用一系列FPS值,是当前推荐的控制. 单F ...
- 安卓获取摄像头帧率_Android Camera预览时输出的帧率控制
Android Camera预览时输出的帧率控制 2016年08月16日 14:24:28 阅读数:13250 如果使用MediaCodec硬编码H264,可以使用下面的方法控制编码输出的帧率: Me ...
- android获取网络时区_android 网络获取当前时区
[转]Android配置文件权限一览表 转自:http://blog.csdn.net/kbest/article/details/7495154访问登记属性 android.permission.A ...
- android获取imei兼容_Android如何获取双卡手机IMEI的方法示例
前言: 项目中有个统计付费广告转化率的需求,需要获取用户手机的IMEI.但是网上最常见的方法有坑,也就是TelephonyManager.getDeviceId(),这方法有可能获取的是MEID或者空 ...
- java 获取mp3 封面_android 怎样获取歌曲的专辑封面
展开全部 该图片为使用如下代码解e5a48de588b662616964757a686964616f31333339666135析得到: 参考源码中,音乐目录: packages/apps/Music ...
- android获取imei兼容_Android中获取IMEI码的方法
公共请求头 所有HTTP请求中,都包含如下公共请求头(HTTP Header): 名称 类型 是否必需 描述 Accept String 是 接受的返回类型,目前只支持JSON:application ...
- java 获取手机系统_Android系统信息获取
Build.BOARD // 主板 Build.BRAND // 系统定制商 Build.SUPPORTED_ABIS //CPU指令集 Build.DEVICE // 设备参数 Build.DISP ...
- pyQT 视频播放器(三) 实现视频截图、获取每一帧数据
pyQT 视频播放器(三) 实现视频截图.获取每一帧数据 背景 方法调研 详细代码说明 最终效果 总结: 参考资料 背景 在 "PyQt5 实现视频播放器(二) ,详细版本 ,适合新手入门& ...
- 安卓获取摄像头帧率_一种基于android终端提高USB2.0摄像头高分辨率高帧率的方法...
一种基于android终端提高USB2.0摄像头高分辨率高帧率的方法 [技术领域] [0001 ]本发明涉及通讯技术领域,尤其涉及一种基于android终端提高USB2.0摄像头高分辨率高帧率的方法. ...
最新文章
- linux版的lcx
- Nginx 负载均衡配置和策略
- 计算机英语句子缩略,根据汉语意思完成英语句子,每空一词(含缩略形式)。 【1】-咋考网...
- ABAP Text表的实现原理
- 75. 颜色分类 golang
- react js 按条数 展开/折叠
- 飞鸽传书2007用户需求就是做好需求处理
- The Rise of Worse Is Better 论文-学习笔记
- java等边三角形代码_Java实现等边三角形--小程序,大思想
- sourceinsight安装记录
- 登陆界面网页代码_Opera Touch移动浏览器登陆iPad 并引入隐私浏览模式
- 基于javaweb+jsp的房屋租赁管理系统(java+SSM+Layui+Maven+Mysql+Jsp)
- 方向余弦矩阵与四元数
- 安卓设备投影到电脑PC端的简单实现
- html转微信公众号,通过htmlparse动态抓取微信公众号的文章
- 微分方程之一阶线性及可降阶方程
- c语言中除法与余数,带符号整数的除法与余数
- Opencv3.0-python: 编译报错color.cpp:7456: error: (-215) scn == 3
- python画一片树叶的故事_《Python数据分析与机器学习实战-唐宇迪》读书笔记第7章--决策树...
- 【无标题】profinet输入输出式分布式IP67总线IO模块
热门文章
- linux基本命令之文件浏览(cat,more,less,tail,head),文件操作命令(cp,mv,rm,find)
- 第十二章 SQL谓词 %INSET
- lm曲线公式推导_LM曲线-经典微观理论- 人大经济论坛-经管百科
- Shader山下(十一)纹理混合
- 哇!微软 Excel 竟然还能实现 CV 算法
- AWS之S3套CloudFront的CDN
- input标签怎么取消边框
- skyeye-基于layui的一套win10系列的OA系统
- 三点教会你怎么选购数据线
- HBase开发SQL查询中间件之查询原理