自定义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. equalsIgnoreCase()和equals()的区别

    String a="ABC";a.equals("abc")为false,a.equalsIgnoreCase("abc")为true;eq ...

  2. SQL三表左关联查询

    今天在开发的时候遇到了一个需求就是三遍关联查询,表A包含有表B和表C的uid,然后使用left join左关联查询: SELECT c.`uid`, `fromuseruid`, `touseruid ...

  3. 解决关于:TypeError: Class constructor Model cannot be invoked without 'new'

    问题描述:在工作过程中出现 TypeError: Class constructor Model cannot be invoked without 'new' 这个错误 以下是报错代码: class ...

  4. Linux编程 10 (shell外部命令与内建命令,alias ,type命令)

    一.  内部命令 Linux命令有内部命令(内建命令)和外部命令之分,内部命令和外部命令功能基本相同,但也有些细微差别.内部命令不需要使用子进程来执行,它们已经和shell编译成一体,作为shell工 ...

  5. hashMap的hashCode() 和equal()的使用

    hashMap的hashCode() 和equa()的使用 在java的集合中,判断两个对象是否相等的规则是: ,判断两个对象的hashCode是否相等 如果不相等,认为两个对象也不相等,完毕 如果相 ...

  6. 并发服务器三种实现方式之进程、线程和select

    前言:刚开始学网络编程,都会先写一个客户端和服务端,不知道你们有没有试一下:再打开一下客户端,是连不上服务端的.还有一个问题不知道你们发现没:有时启服务器,会提示“Address already in ...

  7. TCP/IP 笔记 - 安全

    安全:可扩展身份认证协议.IP安全协议.传输层安全.DNS安全.域名密钥识别邮件 任何由用户或以用户账号执行却违背了用户本身意愿的软件被称为恶意软件 网络安全是一门十分广泛及有深度的学识,而本书旨在了 ...

  8. MySQL社区版升级到Percona Server

    出于磁盘空间的考虑,在调研以后把磁盘空间紧张的库的引擎改为tokudb,(在改为tokudb引擎之前是innodb引擎,已经压缩过,但空间还是紧张)关于tokudb的优势各位自行查阅相关资料.要启用t ...

  9. Win32之隐藏DLL隐藏模块技术

    Win32之隐藏DLL隐藏模块技术 这一讲涉及到windows底层技术.跟汇编内容. 我们才可以实现模块隐藏(也称为DLL隐藏) 一丶API反汇编勾引兴趣 我们都用过Windows的进程跟线程API  ...

  10. python实战学习之matplotlib绘图

    matplotlib 是最流行的Python底层绘图库,主要做数据可视化图表 可以将数据可视化,能够更直观的呈现数据 matplotlib绘图基本要点 首先实现一个简单的绘图 # 导入pyplot f ...