自定义SurfaceView

主要步骤:

实现SurfaceHolder.Callback接口,创建SurfaceView的生命周期

实现Camera.PreviewCallback接口,创建预览回调接口

创建Camera打开相机

实例:

public class CameraSurfaceViews extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback{

    Context mContext;
SurfaceHolder mSurfaceHolder;//surface的控制器
Camera mCamera;//相机类
FrameCallback mCb;//数据回调接口 public void setmCb(FrameCallback mCb) {
this.mCb = mCb;
}
   //获取surfaceView的SurfaceHolder对象和接口
public CameraSurfaceViews(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
mSurfaceHolder = getHolder();
mSurfaceHolder.addCallback(this); }
//寻找相机
private int findCamera(boolean isfront) {
int cameraCount = 0;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras(); for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
Camera.getCameraInfo(camIdx, cameraInfo);
if (isfront) {
// CAMERA_FACING_FRONT前置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
return camIdx;
}
} else {
// CAMERA_FACING_BACK后置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {
return camIdx;
}
} }
return -1;
} //打开相机
private Camera getCamera() {
Camera camera = null;
int cameraId = findCamera(false);
try {
if(cameraId==1){
camera = Camera.open(cameraId );
}else if(cameraId==0)(
camera = Camera.open(0);
}
       
} catch (Exception e) {
camera = null;
}
return camera;
} //surface被创建时调用
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera = getCamera();
    
}
//surface大小被改变时调用
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
    setStartPreview(mCamera,mSurfaceHolder);
}
  //surface被销毁时调用
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
} //开启相机预览
private void setStartPreview(Camera camera, SurfaceHolder holder) {
try { mCamera.setPreviewDisplay(holder);
mCamera.setPreviewCallback(this);
camera.startPreview();
} catch (IOException e) {
}
}
//释放Camera
public void releaseCamera() {
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();// 停掉摄像头的预览
mCamera.release();
mCamera = null;
}
}
//预览回调,传递yuv视频流数据
@Override
public void onPreviewFrame(byte[] bytes, Camera camera) {
// Log.i("onPreviewFrame",""+ bytes);
if(mCb!= null){
mCb.onDecodeFrame(bytes);
}
}
}

FrameCallback回调接口

public interface FrameCallback {
void onDecodeFrame(byte[] data) ;
}

MainActivity

public class MainActivity extends AppCompatActivity implements FrameCallback{

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
  } @Override
public void onDecodeFrame(byte[] data) {
      //实时处理yuv视频流数据
} }

相关阅读

了解SurfaceView

Yuv数据格式相关转换方法

Android开启相机预览获取Yuv视频流数据的更多相关文章

  1. 在Android中使用OpenGL ES开发第(四)节:相机预览

    笔者之前写了三篇Android中使用OpenGL ES入门级的文章,从OpenGL ES的相关概念出发,分析了利用OpenGL ES实现3D绘图的重要的两个步骤:定义形状和绘制形状,简单的绘制了一个三 ...

  2. 【腾讯优测干货分享】Android 相机预览方向及其适配探索

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/583ba1df25d735cd2797004d 由于Android系统的开放策略 ...

  3. Android Camera API/Camera2 API 相机预览及滤镜、贴纸等处理

    Android Lollipop 添加了Camera2 API,并将原来的Camera API标记为废弃了.相对原来的Camera API来说.Camera2是又一次定义的相机 API,也重构了相机 ...

  4. Android远程桌面助手(B1185)for Android P开发者预览版

    Android P的开发者预览版已出,其中App compatibility changes部分特别强调“The platform restricts the use of some non-SDK ...

  5. Android 10开发者预览版功能介绍

    Android P的开发者预览版最亮眼的功能莫过于支持“刘海屏”等屏幕显示.同样在适配可折叠设备方面,Android Q的第一个开发者预览版也很“接地气”,谷歌早在去年11月就发布了对可折叠设备的支持 ...

  6. Android平台之不预览获取照相机预览数据帧及精确时间截

    在android平台上要获取预览数据帧是一件极其容易的事儿,但要获取每帧数据对应的时间截并不那么容易,网络上关于这方面的资料也比较少.之所以要获取时间截,是因为某些情况下需要加入精确时间轴才能解决问题 ...

  7. [android] 开启新的activity获取他的返回值

    应用场景:打开一个新的activity,在这个activity上获取数据,返回给打开它的界面 短信发送时,可以直接选择系统联系人 界面布局是一个线性布局,里面右侧选择联系人在EditText的右上,因 ...

  8. 关于降低android手机摄像头预览分辨率

    假设现在有这样一个需求需要一直开着手机摄像头 但是不做任何拍照动作 但是每个手机的相机分辨率都不同 而默认预览的时候参数是最大分辨率 这样有时候就回导致电量损耗的加快 所以我们可以采取降低相机分辨率的 ...

  9. android camera 摄像头预览画面变形

    问题:最近在处理一下camera的问题,发现在竖屏时预览图像会变形,而横屏时正常.但有的手机则是横竖屏都会变形. 结果:解决了预览变形的问题,同时支持前后摄像头,预览无变形,拍照生成的jpg照片方向正 ...

随机推荐

  1. 解决spring的bean同名冲突

    今天工作发现当不同模块下有相同bean然后又被同一个模块引用的话就会导致bean同名冲突,如下: 解决方案很简单,如果是xml配置直接修改bean的名称即可,如果是注解形式修改如下: 只要在servi ...

  2. mybatis框架(2)---mapper代理方法

    mapper代理方法 在我们在写MVC设计的时候,都会写dao层和daoimp实现层,但假如我们使用mapper代理的方法,我们就可以不用先daoimp实现类 当然这得需要遵守一些相应的规则: (1) ...

  3. 知其然而所以然:Operating System 概述和学习图

    大神绕道,鄙人初入 OS . 一.想知OS,先知计算机系统概述 #图解 #基本指令和中断周期 #直接内存存取(Direct Memory Access,DMA) I/O模块对存储器发出读命令或者写命令 ...

  4. LINUX负载均衡LVS-DR搭建

    1.搭建前的规划工作 这里从lvs官方网站找了一个nat模型的图,如下: 我这里使用虚拟机模拟出了4台rhel6机器.一台服务器作为lvs调度器(和宿主机桥接),3台服务器作为具体的web服务器(使用 ...

  5. 纯JS实现加载更多(VUE框架)

    <template> <div class = 'car_list' reft='scrollobx' @scroll='scrollready($event)'> </ ...

  6. Nacos系列:欢迎来到Nacos的世界!

    什么是Nacos? Nacos 是构建以"服务"为中心的现代应用架构 (例如微服务范式.云原生范式) 的服务基础设施. Nacos可以做什么? 1.动态配置服务:支持以中心化.外部 ...

  7. Java 8 ThreadLocal 源码解析

    Java 中的 ThreadLocal是线程内的局部变量, 它为每个线程保存变量的一个副本.ThreadLocal 对象可以在多个线程中共享, 但每个线程只能读写其中自己的副本. 目录: 代码示例 源 ...

  8. 南大算法设计与分析课程复习笔记(1) L1 - Model of computation

    一.计算模型 1.1 定义: 我们在思考和处理算法的时候是机器无关.实现语言无关的.所有的算法运行在一种“抽象的机器”之上,这就是计算模型. 1.2 种类 图灵机是最有名的计算模型,本课使用更简单更合 ...

  9. Keras入门(二)模型的保存、读取及加载

    本文将会介绍如何利用Keras来实现模型的保存.读取以及加载.   本文使用的模型为解决IRIS数据集的多分类问题而设计的深度神经网络(DNN)模型,模型的结构示意图如下: 具体的模型参数可以参考文章 ...

  10. Linux--Introduction and Basic commands(Part one)

    Welcome to Linux world! Introduction and Basic commands--Part one J.C 2018.3.11 Chapter 1 What Is Li ...