2011-9-23 12:05:13
现在就将TestCase的内容加上
能不能将所有的操作都加到服务里?
怎么传的Surface?
将摄像头操作封装一下
01.package com.camera.CameraPreview;
03.import java.io.IOException;
04.
05.import android.app.Activity;
06.import android.content.pm.ActivityInfo;
07.import android.hardware.Camera;
08.import android.hardware.Camera.PreviewCallback;
09.import android.os.Bundle;
10.import android.view.SurfaceHolder;
11.import android.view.Window;
12.import android.view.SurfaceHolder.Callback;
13.import android.view.SurfaceView;
14.
15.public class PreviewActivity extends Activity implements Callback, PreviewCallback {
16.
17.
18.private SurfaceView mSurface ;
19.
20.private SurfaceHolder mHolder;
21.
22.
23./** Called when the activity is first created. */
25.public void onCreate(Bundle savedInstanceState) {
26.super.onCreate(savedInstanceState);
27.
28.requestWindowFeature(Window.FEATURE_NO_TITLE);
29.//and set the preview to landscape mode.
30.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
31.
32.setContentView(R.layout.main);
33.
34.mSurface = (SurfaceView)this.findViewById(R.id.SurfacePrewView);
35.mHolder = mSurface.getHolder();
36.mHolder.addCallback(this);
37.
38.mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//该代码放在addCallback前还是addCallback后对代码Camera有没有影响
39.}
40.
41.
43.public void surfaceChanged(SurfaceHolder holder, int format, int width,
44.int height) {
45.Camera.Parameters parame = mCamera.getParameters();
46.parame.setPreviewSize(320,480);
47.
48.mCamera.startPreview();
49.}
50.
51.
52.
53.private Camera mCamera ;
54.
56.public void surfaceCreated(SurfaceHolder holder) {
57.if(mCamera!=null)
58.{
59.mCamera.release();
60.mCamera = null ;
61.}
62.//<uses-permission android:name="android.permission.CAMERA" />
63.//必须添加此权限,否则DDMS便会提示你:can not connect to Camera service
64.mCamera = Camera.open();
65.
66.try {
67.mCamera.setPreviewDisplay(mHolder);//此代码必须添加视频才会显示出来
68.mCamera.setPreviewCallback(this);
69.
70.} catch (IOException e) {
71.e.printStackTrace();
72.}
73.}
74.
75.
77.public void surfaceDestroyed(SurfaceHolder holder) {
78.if(mCamera != null)
79.{
80.mCamera.release();
81.mCamera = null ;
82.}
83.}
84.
85.
87.public void onPreviewFrame(byte[] data, Camera camera) {
88.// TODO Auto-generated method stub
89.
90.//get the prew frame here,the data of default is YUV420_SP
91.//you should change YUV420_SP to YUV420_P
92.
93.}
94.
95.
96.
97.
98.}
复制代码
1. 为了确保在所有的平台上你都能够看到画面,SurfaceCreated() SurfaceChanged() SurfaceDestory()请一定要按照上面的写法写:
SurfaceCreated中注意
mCamera.setPreviewDisplay(mHolder);//此代码必须添加视频才会显示出来
mCamera.setPreviewCallback(this);//设置预览帧的接口,就是通过这个接口,我们来获得预览帧的数据的
2.图像是倒的如何解决?
//and set the preview to landscape mode.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
在SetContentView之前调用此代码,理由大家自己看API文档,解释的麻烦.
3.public void onPreviewFrame(byte[] data, Camera camera)
该接口为获取视频预览帧的接口,传递进来的data,默认是YUV420SP的,H264编码的源默认是YUV420的,将他们转换一下再编码图像就正常了;
转换函数:
01.private byte[] changeYUV420SP2P(byte[]data,int length){
02.int width = 176;
03.int height = 144;
04.byte[] str = new byte[length];
05.System.arraycopy(data, 0, str, 0,width*height);
06.
07.int strIndex = width*height;
08.
09.for(int i = width*height+1; i < length ;i+=2)
10.{
11.str[strIndex++] = data[i];
12.}
13.
14.
15.for(int i = width*height;i<length;i+=2)
16.{
17.str[strIndex++] = data[i];
18.}
19.return str;
20.}
复制代码