摘要:自定义主要步骤实现接口,创建的生命周期实现接口,创建预览回调接口创建打开相机实例的控制器相机类数据回调接口获取的对象和接口寻找相机前置后置打开相机被创建时调用大小被改变时调用被销毁时调用开启相机预览释放停掉摄像头的预览预览回调,传递视频流
自定义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) { } }FrameCallback回调接口
//释放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); } } }
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数据格式相关转换方法
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/2834.html
摘要:相机类相关的几个流程方法打开相机设置相机水平方向在上显示画面设置回调,将数据传递到方法获取相机相关参数停止预览释放相机实现接口获取视频流获取实时的数据流实现接口实现拍照寻找相机前置后置相机参数类获取相机参数获取摄像头支持的各种分辨率设置照Camera相机类相关的几个流程方法 Camera.open(cameraId) 打开相机 camera.setDisplayOrientation(0) ...
摘要:在如何快速实现移动端短视频功能中,我们主要介绍了当前短视频的大热趋势以及开发一个短视频应用所涉及到的功能和业务。在本篇文章中,我们主要谈一谈短视频在端上的具体实现技术。因此上面的方案是目前上比较适合短视频录制的方案。 在《如何快速实现移动端短视频功能?》中,我们主要介绍了当前短视频的大热趋势以及开发一个短视频应用所涉及到的功能和业务。在本篇文章中,我们主要谈一谈短视频在Android端...
摘要:在如何快速实现移动端短视频功能中,我们主要介绍了当前短视频的大热趋势以及开发一个短视频应用所涉及到的功能和业务。在本篇文章中,我们主要谈一谈短视频在端上的具体实现技术。因此上面的方案是目前上比较适合短视频录制的方案。 在《如何快速实现移动端短视频功能?》中,我们主要介绍了当前短视频的大热趋势以及开发一个短视频应用所涉及到的功能和业务。在本篇文章中,我们主要谈一谈短视频在Android端...
摘要:视频采集处理后推流到流媒体服务器,第一部分功能完成。第二部分就是流媒体服务器,负责把从第一部分接收到的流进行处理并分发给观众。五服务器流分发流媒体服务器的作用是负责直播流的发布和转播分发功能。 前言 近两年时间,视频直播可谓大火。在视频直播领域,有不同的商家提供各种的商业解决方案,包括软硬件设备,摄像机,编码器,流媒体服务器等。本文要讲解的是如何使用一系列免费工具,打造一套视频直播方案...
摘要:视频采集处理后推流到流媒体服务器,第一部分功能完成。第二部分就是流媒体服务器,负责把从第一部分接收到的流进行处理并分发给观众。五服务器流分发流媒体服务器的作用是负责直播流的发布和转播分发功能。 前言 近两年时间,视频直播可谓大火。在视频直播领域,有不同的商家提供各种的商业解决方案,包括软硬件设备,摄像机,编码器,流媒体服务器等。本文要讲解的是如何使用一系列免费工具,打造一套视频直播方案...
阅读 2504·2021-11-25 09:43
阅读 2348·2021-11-22 09:34
阅读 2557·2021-11-12 10:34
阅读 1278·2021-10-20 13:46
阅读 1394·2021-02-22 17:16
阅读 2160·2019-08-30 13:21
阅读 739·2019-08-30 11:21
阅读 356·2019-08-30 11:20