天天看點

Android Camera簡述

 <b>Android Camera</b><b>簡述</b>

         好吧,别人的分析都是系統層面的==,我這算是醬油文章麼?默默路過T^T。

<b>一、</b><b>Camera</b>

         package android.hardware

         該類用于設定圖像捕獲設定,開啟/關閉預覽,抓拍圖檔以及擷取幀用于編碼視訊。這個類是Camera服務的用戶端,用于管理真實的照相機硬體。

         為了能夠通路照相機,你必須在你的Android Manifest内聲明CAMERA權限。同時確定包括了&lt;uses-feature&gt;節點元素,來聲明你所使用的camera功能。例如,如果你使用了照相機的自動對焦功能,你的Manifest應當包括以下内容:

&lt;uses-permission android:name="android.permission.CAMERA" /&gt; 

&lt;uses-feature android:name="android.hardware.camera" /&gt; 

&lt;uses-feature android:name="android.hardware.camera.autofocus" /&gt;  

         用該類拍照的執行步驟:

         1. 通過open(int)函數,獲得一個Camera執行個體。

         2. 通過getParameters()函數,獲得已有的設定(預設)。

         3. 如果需要的話,調用setParameters(Camera.Parameters)函數,修改第二步傳回的Camera.Parameters對象。

         4. 如果需要的話,調用setDisplayOrientation(int)函數,設定螢幕水準或垂直。

         5. <b>重要</b>:傳遞一個已初始化好的SurfaceHolder對象給setPreviewDisplay(SurfaceHolder)函數。如果沒有surface,camera将無法打開預覽。

         6. <b>重要</b>:調用startPreview()函數開始更新預覽surface。預覽必須在你照相前啟動。

         7. 在你想要捕獲一張照片時,調用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)函數。等待回調函數中給出的實際圖像資料。

         8. 在照相後,預覽顯示将會停止。如果要照更多相片,需要再次調用startPreview()函數(回至第六步)。

         9. 調用stopPreview()函數,停止更新預覽surface。

         10. <b>重要</b>:調用release()函數,釋放camera引用,以便其他應用使用。應用應當在onPause()調用時立刻釋放camera引用(在onResume()時重新打開它)。

         快速轉換到視訊錄像模式,用以下步驟:

         1. 如上所述,擷取一個初始化好的Camera對象并開啟預覽。

         2. 調用unlock()函數,以允許media程序得以通路camera。

         3. 傳遞目前camera對象至setCamera(Camera)函數。請檢視MediaRecorder關于視訊錄制的資訊。

         4. 當結束錄制時,調用reconnect()函數重新取的和加鎖camera對象。

         5. 如上所述,調用stopPreview()和release()函數,結束拍攝。

         這個類是線程不安全的,意味着是通過event線程使用的該類。大多數長時間運作的操作(預覽、聚焦、拍照等)都是非同步的,并且是在需要的時候才會回調。而這些回調函數是在event線程open(int)函數被調用時觸發的。是以,該類的方法一定不能在多線程内調用。

         警告:不同的Android裝置有不同的硬體規格,如兆像素等級和自動對焦性能。為了使你的應用和更多裝置相容,最好不要限制camera規格。

         翻譯自:官方SDK文檔(無聊的緊啊==)。

<b>二、照相</b>

<b>1</b><b>)系統相機</b>

1.1)調用方式

         系統相機的入口Action:MediaStore.ACTION_IMAGE_CAPTURE。隻需以startActivityForResult(…)啟動該Activity即可。

1.2)處理方式

         在onActivityResult(…)中,處理傳回資訊。

<b>2</b><b>)自定義相機</b>

2.1)照相預覽

         繼承SufaceView寫自己的預覽界面,繼而放到你的照相Activity的布局裡。可以寫個照相監聽接口,用于在Activity裡處理這些照相操作。

2.2)照相活動

         就是我們自己做的照相Activity了。完成後調用自己的相機,也就是跳轉入這個Activity。而獲得照片後,可以直接處理或者存入媒體庫。

2.3)照相調用

         以startActivityForResult(…)方式跳轉入照相Activity,在拍完照片後setResult(…)傳回。建議存入媒體庫,将照片的uri傳回。直接data資料的話,多拍時,是承受不了的==。

2.4)照相處理

<b>三、攝像</b>

<b>1</b><b>)系統攝像</b>

         系統攝像的入口Action:MediaStore.ACTION_VIDEO_CAPTURE。視訊捕捉intent可以包含以下附帶資訊:

         MediaStore.EXTRA_OUTPUT——本設定需要一個Uri,用于指定儲存視訊的路徑和檔案名。本設定是可選項,但強烈建議使用。如果未指定本設定值,那麼攝像應用将會把所請求的視訊以預設檔案名和路徑進行儲存,并将資料置入intent的Intent.getData()部分傳回。

         MediaStore.EXTRA_VIDEO_QUALITY——本值用0表示最低品質及最小的檔案尺寸,用1表示最高品質和較大的檔案尺寸。

         MediaStore.EXTRA_DURATION_LIMIT——本值用于限制所捕獲視訊的長度,以秒為機關。

         MediaStore.EXTRA_SIZE_LIMIT——本值用于限制所捕獲視訊的檔案尺寸,以位元組為機關。

<b>2</b><b>)自定義攝像</b>

2.1)流程簡述

         Android架構的視訊捕捉需要對Camera對象進行仔細的管理,還要與MediaRecorder類一起協同工作。使用Camera錄制視訊時,必須管理好Camera.lock()與Camera.unlock()的調用,使得MediaRecorder能夠順利通路攝像頭硬體,并且還要進行Camera.open()和Camera.release()調用。

         <b>注意:</b>自Android 4.0 (API level 14) 開始,Camera.lock()和 Camera.unlock()調用由系統自動管理。

         與用攝像頭拍照不同,視訊捕獲必需十分精确地按順序進行調用。必須按照特定的順序來執行,應用程式才能成功地準備并捕獲視訊,詳細步驟如下。

1. <b>打開攝像頭</b>——用Camera.open()來獲得一個camera對象的執行個體。

2. <b>連接配接預覽</b>——用Camera.setPreviewDisplay()将camera連接配接到一個SurfaceView,準備實時預覽。

3. <b>開始預覽</b>——調用 Camera.startPreview()開始顯示實時攝像畫面。

4. <b>開始錄制視訊</b>——嚴格按照以下順序執行才能成功錄制視訊:

         a. <b>解鎖Camera</b>——調用Camera.unlock()解鎖,便于MediaRecorder使用攝像頭。

         b. <b>配置MediaRecorder</b>——按照如下順序調用MediaRecorder中的方法。詳情請參閱MediaRecorder參考文檔。

                  1. setCamera()——用目前Camera執行個體将攝像頭用途設定為視訊捕捉。

                  2. setAudioSource()——用MediaRecorder.AudioSource.CAMCORDER設定音頻源。

                  3. setVideoSource()——用MediaRecorder.VideoSource.CAMERA設定視訊源。

                  4. 設定視訊輸出格式和編碼格式。對于Android 2.2 (API Level 8) 以上版本,使用MediaRecorder.setProfile方法,并用CamcorderProfile.get()來擷取一個profile執行個體。對于Android prior to 2.2以上版本,必須設定視訊輸出格式和編碼參數:

                           i. setOutputFormat()——設定輸出格式,指定預設設定或MediaRecorder.OutputFormat.MPEG_4。

                           ii. setAudioEncoder()——設定聲音編碼類型。指定預設設定或MediaRecorder.AudioEncoder.AMR_NB。

                           iii. setVideoEncoder()——設定視訊編碼類型,指定預設設定或者 MediaRecorder.VideoEncoder.MPEG_4_SP。

                  5. setOutputFile()——用getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()設定輸出檔案,見儲存媒體檔案一節中的方法示例。

                  6. setPreviewDisplay()——用上面<b>連接配接預覽</b>中設定的對象來指定應用程式的SurfaceView預覽layout元素。

                  <b>警告:</b> 必須按照如下順序調用MediaRecorder的下列配置方法,否則應用程式将會引發錯誤,錄像也将失敗。

         c. <b>準備MediaRecorder</b>——調用MediaRecorder.prepare()設定配置,準備好MediaRecorder。

         d. <b>啟動MediaRecorder</b>——調用MediaRecorder.start()開始錄制視訊。

5. <b>停止錄制視訊——</b>按照順序調用以下方法,才能成功完成視訊錄制:

         a. <b>停止MediaRecorder</b>——調用MediaRecorder.stop()停止錄制視訊。

         b. <b>重置MediaRecorder</b>——這是可選步驟,調用MediaRecorder.reset()删除recorder中的配置資訊。

         c. <b>釋放MediaRecorder</b>——調用MediaRecorder.release()釋放MediaRecorder。

         d. <b>鎖定攝像頭</b>——用Camera.lock()鎖定攝像頭,使得以後MediaRecorder session能夠使用它。自Android 4.0 (API level 14)開始,不再需要本調用了,除非MediaRecorder.prepare()調用失敗。

6. <b>停止預覽</b>——activity使用完攝像頭後,應用Camera.stopPreview()停止預覽。

7. <b>釋放攝像頭</b>——使用Camera.release()釋放攝像頭,使其它應用程式可以使用它。

<b>注意:</b> 也可以不必先建立攝像頭預覽就使用MediaRecorder,并跳過本節開始的幾步。不過,因為使用者一般都希望在開始錄像前看到預覽畫面,這裡就不讨論那類過程了。

         摘錄自:後記-&gt;參閱内容1

2.2)攝像預覽

         攝像頭預覽類,用于嵌入一個View布局中。其實作了SurfaceHolder.Callback接口來捕捉view建立和銷毀時的回調事件。

2.3)攝像活動

         按官方開發者指南裡的流程實作的(參閱2.1流程簡述)。但這不同版本和硬體下有些問題==,在代碼裡有稍帶說明。

         ps:至于想要實作一個優秀的Camera攝像,請看後記-&gt;參閱内容2。

2.4)攝像調用

         以startActivity (…)方式跳轉入攝像Activity即可。當然也可以用startActivityForResult(…),在攝像完成後setResult(…)傳回^^。

<b>四、後記</b>

<b>1</b><b>)參閱内容</b>

1.1)SDK docs-&gt;Dev Guide-&gt;Multimedia and Camera-&gt;Camera

1.2)Camera攝像在不同版本不同硬體環境下不通用==

         想實作更優秀的方式,請參考Sipdroid開源項目^^

         參考檔案:org.sipdroid.sipua.ui包下的VideoPreview.java&amp;VideoCamera*.java

         ps:可以考慮學習下該開源項目,求入手分析資料啊T^T

<b>2</b><b>)子產品概覽</b>

2.1)Camera照相

<a target="_blank" href="http://blog.51cto.com/attachment/201204/083106502.png"></a>

2.2)Camera攝像

<a target="_blank" href="http://blog.51cto.com/attachment/201204/083106968.png"></a>

<b>3</b><b>)運作效果</b>

1)相機調用

<a target="_blank" href="http://blog.51cto.com/attachment/201204/083106369.png"></a>

2)自定義相機

<a target="_blank" href="http://blog.51cto.com/attachment/201204/083106280.png"></a>

3)攝像調用

<a target="_blank" href="http://blog.51cto.com/attachment/201204/083408332.png"></a>

4)自定義攝像

<a target="_blank" href="http://blog.51cto.com/attachment/201204/083205699.png"></a>

     本文轉自winorlose2000 51CTO部落格,原文連結:http://blog.51cto.com/vaero/834878,如需轉載請自行聯系原作者

繼續閱讀