2011-9-23 12:05:13

 

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. */

24.@Override

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.

42.@Override

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.

55.@Override

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.

76.@Override

77.public void surfaceDestroyed(SurfaceHolder holder) {

78.if(mCamera != null)

79.{

80.mCamera.release();

81.mCamera = null ;

82.}

83.}

84.

85.

86.@Override

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

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章