SurfaceView显示Camera摄像(之二设置参数、变焦)
来源:互联网 发布:高中课程教学视频软件 编辑:程序博客网 时间:2024/05/17 06:33
上次已经写过SurfaceView显示Camera摄像了,代码可以运行,但是里面有问题,这次纠正过来,顺便实现变焦:
代码:
public class CameravedioActivity extends Activity{private static final String TAG = "CameravedioActivity";private Camera camera; private boolean preview = false ; private SeekBar mSeekBar; private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* *设置窗口属性:一定要在 setContentView(R.layout.main) 之前 */// 窗口标题,其实可以在manifes文件里面注册// requestWindowFeature(Window.FEATURE_NO_TITLE);// 全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); surfaceView = (SurfaceView) findViewById(R.id.surfaceView); surfaceHolder = surfaceView.getHolder(); surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceView.getHolder().setFixedSize(200, 200); surfaceView.getHolder().addCallback(new SurfaceViewCallback()); /** * seekbar 用来实现变焦逻辑 */ mSeekBar = (SeekBar)findViewById(R.id.seekbar); mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// TODO Auto-generated method stubLog.d(TAG, "progress:"+progress);//sdk 文档描述 set zoom 之前先check if(camera.getParameters().isZoomSupported()){Parameters params = camera.getParameters();params.setZoom(progress);camera.setParameters(params);}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stubLog.d(TAG, "onStartTrackingTouch");}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stubLog.d(TAG, "onStartTrackingTouch");} }); } @Overrideprotected void onResume() {// TODO Auto-generated method stubsuper.onResume();}public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); int degrees = 0; Log.d(TAG, "rotation:"+rotation); switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); }private final class SurfaceViewCallback implements Callback {/** * surfaceView 被创建成功后调用此方法 */@Overridepublic void surfaceCreated(SurfaceHolder holder) {Log.d(TAG,"surfaceCreated");/* * 在SurfaceView创建好之后 打开摄像头 * 注意是 android.hardware.Camera *///2.2获取摄像头number physical cameras //api 9: Camera.getNumberOfCameras()Log.d(TAG, "numbers:"+Camera.getNumberOfCameras());if(Camera.getNumberOfCameras() ==2){//前置摄像头//api 9 :Camera.CameraInfocamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);camera.setDisplayOrientation(90);}else{camera = Camera.open();}//camera = Camera.open();//setCameraDisplayOrientation(CameravedioActivity.this,Camera.CameraInfo.CAMERA_FACING_FRONT,camera);Log.d(TAG, "smoothZoom:"+camera.getParameters().isSmoothZoomSupported());Log.d(TAG, "supportzoom:"+camera.getParameters().isZoomSupported());Log.d(TAG, "max zoom:"+camera.getParameters().getMaxZoom());/* * This method must be called before startPreview(). otherwise surfaceview没有图像 */try {camera.setPreviewDisplay(surfaceHolder);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}Camera.Parameters parameters = camera.getParameters();/* 每秒从摄像头捕获5帧画面, */parameters.setPreviewFrameRate(5);/* 设置照片的输出格式:jpg */parameters.setPictureFormat(PixelFormat.JPEG);/* 照片质量 */parameters.set("jpeg-quality", 85);mSeekBar.setMax(parameters.getMaxZoom());//valid parameters:// 取得相机所支持多少图片大小的个数List<Size> pszize = parameters.getSupportedPreviewSizes();//List<Size> pszize = parameters.getSupportedPictureSizes(); if (null != pszize && 0 < pszize.size()) { int height[] = new int[pszize.size()];// 声明一个数组 Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int i = 0; i < pszize.size(); i++) { Size size = (Size) pszize.get(i); int sizeheight = size.height; int sizewidth = size.width; height[i] = sizeheight; map.put(sizeheight, sizewidth); Log.d(TAG, "size.width:"+sizewidth+"\tsize.height:"+sizeheight); } Arrays.sort(height); // 设置// parameters.setPictureSize(map.get(height[0]),height[0]); parameters.setPreviewSize(map.get(height[0]),height[0]); }/* 将参数对象赋予到 camera 对象上 */camera.setParameters(parameters);camera.startPreview();/** * Installs a callback to be invoked for every preview frame in addition to displaying them on the screen. * The callback will be repeatedly called for as long as preview is active. This method can be called at * any time, even while preview is live. Any other preview callbacks are overridden. * a callback object that receives a copy of each preview frame, or null to stop receiving */camera.setPreviewCallback(new Camera.PreviewCallback(){@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {// TODO Auto-generated method stub //在视频聊天中,这里传送本地frame数据给remote端//Log.d(TAG, "camera:"+camera);//Log.d(TAG, "byte:"+data);}});preview = true;}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {Log.d(TAG,"surfaceChanged");}/** * SurfaceView 被销毁时释放掉 摄像头 */@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {if(camera != null) {/* 若摄像头正在工作,先停止它 */if(preview) {camera.stopPreview();preview = false;}//如果注册了此回调,在release之前调用,否则release之后还回调,crashcamera.setPreviewCallback(null);camera.release();}}}}注册文件:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.edu.wtu" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <!-- android:screenOrientation="landscape" 表示横向界面 --> <activity android:name=".CameravedioActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="7" /> <!-- 在SDCard中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 往SDCard写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 申请使用摄像头的权限 --><uses-permission android:name="android.permission.CAMERA"/></manifest>
布局文件:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" ><SurfaceView android:id="@+id/surfaceView" android:layout_width="200dip" android:layout_height="150dip" android:layout_gravity="center" android:visibility="visible" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <SeekBar android:id="@+id/seekbar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="40dip" android:layout_marginRight="40dip" android:layout_gravity="center" android:progressDrawable="@android:color/transparent" android:background="@drawable/progressbar_box" /> </LinearLayout> </LinearLayout></FrameLayout>seekbar用来实现调焦的
- SurfaceView显示Camera摄像(之二设置参数、变焦)
- camera摄像原理之二:色彩空间
- camera摄像原理之二:色彩空间
- camera摄像原理之二:色彩空间
- camera摄像原理之二:色彩空间
- camera摄像原理之二:色彩空间
- camera摄像原理之二:色彩空间
- camera摄像原理之二:色彩空间
- Camera 预览之SurfaceView、TextureView、GLSurfaceView(二)
- 二、Camera显示之Framework层设置显示窗口
- Android之SurfaceView、Camera
- android Camera 中如何修改缩放变焦参数
- 视频播放surfaceView camera,获取预览图像显示setPreviewCallback()
- Android Camera之SurfaceView学习
- Android Camera之SurfaceView学习
- Android之SurfaceView(二)
- 模块[camera]_变焦与对焦(转自csdn)
- Taking Videos with the Camera(摄像)
- ffmpeg + x264 编码H264(x86+arm)
- URL传中文乱码
- Altium Designer 6 --一点总结
- sql server 数据库优化--显示执行计划
- flexlib开源组件库
- SurfaceView显示Camera摄像(之二设置参数、变焦)
- android 软键盘布局 及 关闭 弹出
- 程序在resin中运行时产生意外多条线程
- .Net4.0 Dynamic 使用
- Win7启动修复MBR(Win7+Linux删除Linux后进入grub rescue的情况)
- 飞机订票系统登录测试脚本
- Could not open Hibernate Session for transaction . or java.net.SocketException: Broken pipe
- c语言笔试重点
- sql 百万级数据库优化方案