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.}
複製代碼