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获取摄像头视频帧数据相关推荐

  1. Android不显示Camera视频获取摄像头视频帧数据

    1.在Activity界面代码中: private var mCamera: Camera? = null private val mWidth = GwApplication.DEFAULT_REM ...

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

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

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

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

  4. 使用FFMpeg API 获取摄像头的图像数据

    文章目录 1. 获取摄像头的信息 2. 打开并初始化摄像头 3. 获取摄像头数据及渲染 摄像头是我们比较常用的外设,很多场景我们都会用到摄像头.比如视频直播.视频监控等各个领域都会用到摄像头.摄像头图 ...

  5. Facebook应用开发-之获取直播视频分析数据

    业务场景 1.我的业务场景:从Facebook平台,获取直播视频分析数据(用于数据统计)2.适用的业务场景:Facebook开发平台第三方应用开发Puppeteer爬取Facebook/其他网页数据 ...

  6. Android 获取网络视频某一帧图片

    获取网络视频的某一帧作为封面图,可以使用Glide实现,但是效果不是很好,主要问题就是加载慢,有几秒的延迟.这里利用Android提供的MediaMetadataRetriever类来获取.Media ...

  7. Qt从视频中获取每一帧数据

    参考了以下文章:https://blog.csdn.net/jxbinwd/article/details/81034339 我按照上面文章的描述写程序,解析出来的图像保存成图片.保存的图片有很多乱码 ...

  8. Android 获取网络视频第一帧

    获取网络视频第一帧 public static Bitmap getNetVideoBitmap(String videoUrl) {Bitmap bitmap = null;MediaMetadat ...

  9. android获取网络视频缩略图,Android 获取视频(本地和网络)缩略图的解决方案

    在Android 开发视频的时候,通常都需要显示视频列表,而视频列表通常都有一张视频缩略图,那么它是怎么获取的呢, 关于网络视频的缩略图的实现方案主要有两种: 1.后台返回视频时顺便连缩略图的路径都返 ...

最新文章

  1. 学习python一开始枯燥_编程零基础应当怎样开始学python?他说,看这三个经典方法...
  2. python3 byte_「Python3学习笔记」读书笔记—字节数组
  3. Check failed: error == cudaSuccess (35 vs. 0) CUDA driver version is insufficient for CUDA runtime
  4. 第四章:滚动堆栈(1)
  5. 人才短缺、成本高昂,制造企业智能化转型路径如何破局?
  6. 简明 Python 教程学习笔记_2_函数
  7. mysql一共有多少引擎_MySQL存储引擎你们知道多少?
  8. 用eslint + prettier + pre-commit管理项目(React)
  9. MySQL解析json字符串的相关问题
  10. PHP 中 new static 和 new self 的区别
  11. linux php 源码安装,Linux下PHP的源码安装与配置
  12. PHP分批次处理数据
  13. 怎样用计算机10,win10计算器如何使用?win10自带计算器的使用方法
  14. 12.QT + OpenCV打包成应用(以及QT图标问题详细) --- OpenCV从零开始到图像(人脸 + 物体)识别系列
  15. nodejs+koa2实现微信小程序签名和请求支付(二)
  16. MAME模拟器debug帮助文档汉化一(介绍)
  17. CTF之萌新web学习(命令执行2)
  18. golang开发:WaitGroup Mutex
  19. 远程桌面 CredSSP加密Oracle修正 解决方法
  20. 7款超适用的PC软件,实用强大,让您秒变大师兄

热门文章

  1. 地质雷达物理测量RADAN®7软件(Radan 7.6.19.11260)最新下载
  2. tomcat是否区分32位和64位
  3. 【Bigdecimal】
  4. 超链接的目标属性值意义_在超链接中,如果暂时没有确定链接目标,通常将标记的href属性值定义为“*”。:...
  5. apache+mod_python的安装与配置
  6. call()、apply()、bind()的使用和区别以及使用场景
  7. infinity插件安装
  8. Java架构师面试题全分享,你离架构师还有多远?
  9. 05-CSS 权重 盒模型 标准文档流 浮动
  10. 平面设计【EPS】13款手绘花卉花环背景矢量素材