android获取摄像头视频帧数据
1.思路
一.通过android的Camera.setPreviewCallback(PreviewCallback cb)监听回调.
二.此回调函数public void onPreviewFrame(byte[] data, Camera camera)每回调一次就是获取到摄像头的一帧原始数据即data字节数组。
三.这个字节数组经过YuvImage类包装压缩成特定类型图片。
2.代码实现
一.权限
<uses-permission android:name="android.permission.CAMERA"/>
二.布局
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.yuncai.menjin.camera_demo.MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="200dp"android:gravity="center"android:orientation="horizontal"><RelativeLayoutandroid:layout_width="200dp"android:layout_height="200dp"><TextureViewandroid:id="@+id/texture_view"android:layout_width="200dp"android:layout_height="200dp"android:layout_gravity="center_horizontal" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:text="TextureView(摄像头预览)"android:textColor="#f00"android:textSize="10sp" /></RelativeLayout><RelativeLayoutandroid:layout_width="200dp"android:layout_height="200dp"><ImageViewandroid:id="@+id/iv_pic"android:layout_width="200dp"android:layout_height="200dp"android:layout_gravity="right"android:src="@mipmap/ic_launcher" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:text="ImageView(视频帧数据预览)"android:textColor="#f00"android:textSize="10sp" /></RelativeLayout></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="200dp"android:layout_gravity="bottom"android:gravity="center"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_takePic"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="获取视频帧数据" /></LinearLayout>
</merge>
三.java实现代码
package com.yuncai.menjin.camera_demo;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Rect;
import android.graphics.SurfaceTexture;
import android.graphics.YuvImage;
import android.hardware.Camera;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.TextureView;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener {private TextureView textureView;private ImageView ivPic;private Button btnTakePic;private Camera mCamera;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();initListener();}private void initListener() {textureView.setSurfaceTextureListener(this);btnTakePic.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {addCallBack();}});}private void initData() {int numberOfCameras = Camera.getNumberOfCameras();// 获取摄像头个数if(numberOfCameras<1){Toast.makeText(this, "没有相机", Toast.LENGTH_SHORT).show();finish();return;}}private void initView() {textureView = (TextureView) findViewById(R.id.texture_view);
// textureView.setRotation(0); // // 设置预览角度,并不改变获取到的原始数据方向(与Camera.setDisplayOrientation(0)相同)ivPic = (ImageView) findViewById(R.id.iv_pic);btnTakePic = (Button) findViewById(R.id.btn_takePic);}@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {// 打开相机 0后置 1前置mCamera = Camera.open(0);if (mCamera != null) {// 设置相机预览宽高,此处设置为TextureView宽高Camera.Parameters params = mCamera.getParameters();params.setPreviewSize(width, height);// 设置自动对焦模式List<String> focusModes = params.getSupportedFocusModes();if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);mCamera.setParameters(params);}try {
// mCamera.setDisplayOrientation(0);// 设置预览角度,并不改变获取到的原始数据方向// 绑定相机和预览的ViewmCamera.setPreviewTexture(surface);// 开始预览mCamera.startPreview();} catch (IOException e) {e.printStackTrace();}}}private void addCallBack() {if(mCamera!=null){mCamera.setPreviewCallback(new Camera.PreviewCallback() {@Overridepublic void onPreviewFrame(byte[] data, Camera 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());ivPic.setImageBitmap(bmp);stream.close();}}catch(Exception e){e.printStackTrace();}}});}}@Overridepublic void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {}@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {mCamera.stopPreview();mCamera.release();return false;}@Overridepublic void onSurfaceTextureUpdated(SurfaceTexture surface) {}
}
3.效果
android获取摄像头视频帧数据相关推荐
- Android不显示Camera视频获取摄像头视频帧数据
1.在Activity界面代码中: private var mCamera: Camera? = null private val mWidth = GwApplication.DEFAULT_REM ...
- Android -- 获取摄像头帧数据解码
由于Android下摄像头预览数据只能 ImageFormat.NV21 格式的,所以解码时要经过一翻周折. Camera mCamera = Camera.open();Camera.Parame ...
- pyQT 视频播放器(三) 实现视频截图、获取每一帧数据
pyQT 视频播放器(三) 实现视频截图.获取每一帧数据 背景 方法调研 详细代码说明 最终效果 总结: 参考资料 背景 在 "PyQt5 实现视频播放器(二) ,详细版本 ,适合新手入门& ...
- 使用FFMpeg API 获取摄像头的图像数据
文章目录 1. 获取摄像头的信息 2. 打开并初始化摄像头 3. 获取摄像头数据及渲染 摄像头是我们比较常用的外设,很多场景我们都会用到摄像头.比如视频直播.视频监控等各个领域都会用到摄像头.摄像头图 ...
- Facebook应用开发-之获取直播视频分析数据
业务场景 1.我的业务场景:从Facebook平台,获取直播视频分析数据(用于数据统计)2.适用的业务场景:Facebook开发平台第三方应用开发Puppeteer爬取Facebook/其他网页数据 ...
- Android 获取网络视频某一帧图片
获取网络视频的某一帧作为封面图,可以使用Glide实现,但是效果不是很好,主要问题就是加载慢,有几秒的延迟.这里利用Android提供的MediaMetadataRetriever类来获取.Media ...
- Qt从视频中获取每一帧数据
参考了以下文章:https://blog.csdn.net/jxbinwd/article/details/81034339 我按照上面文章的描述写程序,解析出来的图像保存成图片.保存的图片有很多乱码 ...
- Android 获取网络视频第一帧
获取网络视频第一帧 public static Bitmap getNetVideoBitmap(String videoUrl) {Bitmap bitmap = null;MediaMetadat ...
- android获取网络视频缩略图,Android 获取视频(本地和网络)缩略图的解决方案
在Android 开发视频的时候,通常都需要显示视频列表,而视频列表通常都有一张视频缩略图,那么它是怎么获取的呢, 关于网络视频的缩略图的实现方案主要有两种: 1.后台返回视频时顺便连缩略图的路径都返 ...
最新文章
- 学习python一开始枯燥_编程零基础应当怎样开始学python?他说,看这三个经典方法...
- python3 byte_「Python3学习笔记」读书笔记—字节数组
- Check failed: error == cudaSuccess (35 vs. 0) CUDA driver version is insufficient for CUDA runtime
- 第四章:滚动堆栈(1)
- 人才短缺、成本高昂,制造企业智能化转型路径如何破局?
- 简明 Python 教程学习笔记_2_函数
- mysql一共有多少引擎_MySQL存储引擎你们知道多少?
- 用eslint + prettier + pre-commit管理项目(React)
- MySQL解析json字符串的相关问题
- PHP 中 new static 和 new self 的区别
- linux php 源码安装,Linux下PHP的源码安装与配置
- PHP分批次处理数据
- 怎样用计算机10,win10计算器如何使用?win10自带计算器的使用方法
- 12.QT + OpenCV打包成应用(以及QT图标问题详细) --- OpenCV从零开始到图像(人脸 + 物体)识别系列
- nodejs+koa2实现微信小程序签名和请求支付(二)
- MAME模拟器debug帮助文档汉化一(介绍)
- CTF之萌新web学习(命令执行2)
- golang开发:WaitGroup Mutex
- 远程桌面 CredSSP加密Oracle修正 解决方法
- 7款超适用的PC软件,实用强大,让您秒变大师兄
热门文章
- 地质雷达物理测量RADAN®7软件(Radan 7.6.19.11260)最新下载
- tomcat是否区分32位和64位
- 【Bigdecimal】
- 超链接的目标属性值意义_在超链接中,如果暂时没有确定链接目标,通常将标记的href属性值定义为“*”。:...
- apache+mod_python的安装与配置
- call()、apply()、bind()的使用和区别以及使用场景
- infinity插件安装
- Java架构师面试题全分享,你离架构师还有多远?
- 05-CSS 权重 盒模型 标准文档流 浮动
- 平面设计【EPS】13款手绘花卉花环背景矢量素材