自定义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. 数据库语句收藏(MySQL)

    概览 => MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性. =>关键字不区分大小写 => S ...

  2. 厉害了,Spring Cloud for Alibaba 来了!

    最近,Spring Cloud 发布了 Spring Cloud Alibaba 首个预览版本:Spring Cloud for Alibaba 0.2.0. 大家都好奇,这和阿里巴巴有什么关系?莫非 ...

  3. 字符串(string)的常用语法和常用函数

    在python中,加了引号(单引号.双引号.三引号)的字符就是字符串类型,python并没有字符类型. 字符串也是很常用的数据类型,这里介绍一些用的较多的语法和方法,直接以代码示例展示. str = ...

  4. PythonDay02——编程语言、python介绍以及安装解释器、运行程序的两种方式、变量

    一.编程语言 1.1 机器语言:直接用计算机能理解的二进制指令编写程序,直接控制硬件 1.2 汇编语言:用英文标签取代二进制指令去编写程序,本质也是直接控制硬件 1.3 高级语言:用人能理解的表达方式 ...

  5. Storm WordCount

    特别注意,在本地运行的时候应该去掉<scope>provided</scope>,否则会报java.lang.ClassNotFoundException: org.apach ...

  6. 扒光IT界江湖骗子巴蜀万明的底裤

    扒光IT界江湖骗子巴蜀万明的底裤 北京IT界出了个江湖骗子,名叫万明,常年在北京IT界乃至中国IT界招摇撞骗.因其姓名太过大众化,容易误伤他人,对搜索引擎也不够友好,所以前缀以其招摇撞骗常用的一家空壳 ...

  7. Supervisor使用教程

    在项目中,经常有脚本需要常驻运行的需求.以PHP脚本为例,最简单的方式是: $ nohup php cli.php & 这样能保证当前终端被关闭或者按CRTL+C后,脚本仍在后台运行.但是没法 ...

  8. 第8章 CentOS包管理详解

    8.1 Linux上构建C程序的过程 在说明包相关的内容之前,我觉得有必要说一下在Linux上构建一个C程序的过程.我个人并没有学习过C,内容总结自网上,所以可能显得很小白,而且也并非一定正确,只希望 ...

  9. 为Linux配置常用源:epel和IUS

    CentOS上,除了os类的yum源,还需要配置几个常用的源:epel.ius. 有很多国内很多镜像站点都提供了各类仓库的镜像站点,个人感觉比较全的是阿里云http://mirrors.aliyun. ...

  10. Go基础系列:WaitGroup用法说明

    正常情况下,新激活的goroutine的结束过程是不可控制的,唯一可以保证终止goroutine的行为是main goroutine的终止.也就是说,我们并不知道哪个goroutine什么时候结束. ...