Android 从Camera获取视频数据用SurfaceView显示
来源:互联网 发布:windows截屏怎么截图 编辑:程序博客网 时间:2024/06/06 08:23
1、自定义一个SurfaceView
package com.test.camera.preview;
import android.content.Context;
import android.graphics.PixelFormat;
import android.hardware.Camera.CameraInfo;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.test.camera.CameraInterface;
import com.test.observer.FrameCallback;
public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
Context mContext;
SurfaceHolder mSurfaceHolder;
public CameraSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; mSurfaceHolder = getHolder(); mSurfaceHolder.setFormat(PixelFormat.TRANSLUCENT);//translucent半透明 transparent透明 mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mSurfaceHolder.addCallback(this);}@Overridepublic void surfaceCreated(SurfaceHolder holder) { CameraInterface.getInstance().doOpenCamera(null, CameraInfo.CAMERA_FACING_BACK);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { CameraInterface.getInstance().doStartPreview(mSurfaceHolder, 1.333f);}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) { CameraInterface.getInstance().doStopCamera();}public SurfaceHolder getSurfaceHolder() { return mSurfaceHolder;}public void setFrameCallback(FrameCallback fcb) { CameraInterface.getInstance().setFrameCallback(fcb);}
}
2、封装一个CameraInterface类来操作Camera的打开、预览、获取数据等
package com.test.camera;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.view.SurfaceHolder;
import com.test.observer.FrameCallback;
import java.io.IOException;
public class CameraInterface {
private Camera mCamera;
private Camera.Parameters mParams;
private boolean isPreviewing = false;
private static CameraInterface mCameraInterface;
private FrameCallback fcb;
private int mCameraId = -1;
public void setFrameCallback(FrameCallback fcb) { this.fcb = fcb;}public interface CamOpenOverCallback { void cameraHasOpened();}private CameraInterface() {}public static synchronized CameraInterface getInstance() { if (mCameraInterface == null) { mCameraInterface = new CameraInterface(); } return mCameraInterface;}/** * 打开Camera * * @param callback */public void doOpenCamera(CamOpenOverCallback callback, int cameraId) { mCamera = Camera.open(cameraId);//0后置 1前置 if (callback != null) { callback.cameraHasOpened(); }}/** * 开启预览 * * @param holder * @param previewRate */public void doStartPreview(SurfaceHolder holder, float previewRate) { if (isPreviewing) { mCamera.stopPreview(); return; } if (mCamera != null) { mParams = mCamera.getParameters(); mCamera.setParameters(mParams); try { mCamera.setPreviewDisplay(holder); mCamera.startPreview();//开启预览 } catch (IOException e) { e.printStackTrace(); } isPreviewing = true; mParams = mCamera.getParameters(); //重新get一次 mCamera.setPreviewCallback(mJpegPreviewCallback); }}/** * 停止预览,释放Camera */public void doStopCamera() { if (null != mCamera) { mCamera.setPreviewCallback(null); mCamera.stopPreview(); isPreviewing = false; mCamera.release(); mCamera = null; }}
/**
* 获取Camera的数据,
*/
PreviewCallback mJpegPreviewCallback = new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
//传递进来的data,默认是YUV420SP的
fcb.onDecodeFrame(data);
}
};
/** * 获取Camera.Parameters * * @return */public Camera.Parameters getCameraParams() { if (mCamera != null) { mParams = mCamera.getParameters(); return mParams; } return null;}/** * 获取Camera实例 * * @return */public Camera getCameraDevice() { return mCamera;}public int getCameraId() { return mCameraId;}
}
4、在xml中用写好的自定义SurfaceView
<com.test.camera.preview.CameraSurfaceView android:id="@+id/surfaceview" android:layout_width="match_parent" android:layout_height="match_parent"/>
5、添加照相机的相关权限
<!-- 增加文件存储和访问摄像头的权限 --><uses-feature android:name="android.hardware.camera"/><uses-feature android:name="android.hardware.camera.autofocus"/><uses-feature android:glEsVersion="0x00020000"/><uses-permission android:name="android.permission.CAMERA"/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
6、至此就可以正常显示预览视频啦
- Android 从Camera获取视频数据用SurfaceView显示
- 视频播放surfaceView camera,获取预览图像显示setPreviewCallback()
- Camera(android图像、视频获取)
- Android的Camera用SurfaceView拍照
- Android自定义Camera,用SurfaceView预览。
- Android实时取景:用SurfaceView实现 -- Camera
- Android之SurfaceView、Camera
- SurfaceView获取Camera预览界面
- 用Texture代替SurfaceView显示视频
- Camera获取的视频流怎么解析然后在SurfaceView上面播放
- Android Camera之SurfaceView学习
- android Camera SurfaceView变形,为什么?
- Android Camera之SurfaceView学习
- HTML5获取Camera视频
- Android实时取景:用SurfaceView实现 -- Camera 二
- android surfaceview 播放视频
- Android SurfaceView 播放视频
- Android--SurfaceView播放视频
- STM8S外设的端口映射问题
- OutputCache属性详解(二)一 Location
- jq选择器归纳总结
- 浅谈Jquery中的bind(),live(),delegate(),on()绑定事件方式
- 【UNITY资料】UNITY多语言化Localtion的工具 I2 Localization2.6.5 资料教程(二)
- Android 从Camera获取视频数据用SurfaceView显示
- RobotFrameWork(四)变量运算与Evaluate
- java 7 fork/join模糊图像示例, java 8 lambda 并行聚合函数 parallelSort()
- **[Lintcode]Validate Binary Search Tree 验证二叉查找树
- linux 常用命令
- java NIO Server 和 Client简单样例
- SecureCRT下载地址(包含破解程序)
- 实现C语言strcpy()函数
- Mysql性能调优策略