2022年3月23日 星期三

Android Studio - 相機預覽回調函數(Camera Preview Callback)(七十三)

Android Studio - 相機預覽回調函數(Camera Preview Callback)(七十三):

在 Android 相機的 android.hardware.Camera API 有一個接口是 Camera.PreviewCallback,當綁定 Camera.PreviewCallback 函數後,Activity 繼承 PreviewCallback 這個接口就行產生 onPreviewFrame(byte[] bytes, Camera camera) ,即可接收到每一幀的預覽資料,也就是參數 bytes。

相機預覽回調函數(Camera Preview Callback)流程
Camera.PreviewCallback→onPreviewFrame()→setPreviewCallback() / setOneShotPreviewCallback() / setPreviewCallbackWithBuffer()

onPreviewFrame 這個函數並不是在預覽一開始就自動調用的,而是需要觸發的。觸發的方式有三種:

1. setPreviewCallback(PreviewCallback cb) - 一旦使用此方法註冊預覽回檔介面,onPreviewFrame() 方法會一直被調用,直到 camera preview 銷毀。

注意,onPreviewFrame() 方法跟Camera.open() 是運行於同一個執行緒,為了防止 onPreviewFrame() 會阻塞 UI 執行緒,將 Camera.open() 放置在子執行緒中運行。

2. setOneShotPreviewCallback(PreviewCallback cb) - 使用此方法註冊預覽回檔介面時,會將下一幀資料回檔給 onPreviewFrame() 方法,調用完成後這個回檔介面將被銷毀。也就是只會回檔一次預覽幀資料。

3. setPreviewCallbackWithBuffer(PreviewCallback cb) - 它跟 setPreviewCallback 的工作方式一樣,但是要求指定一個位元組陣列作為緩衝區,用於預覽幀資料,這樣能夠更好的管理預覽幀資料時使用的記憶體。它一般搭配 addCallbackBuffer 方法使用。

設置 addCallbackBuffer 的地方有兩個都要設置,一個是在 startPreview之前,一個是在 onPreviewFrame 中,如果在 onPreviewFrame 中不調用,那麼預覽幀資料就不會回檔給 onPreviewFrame。
setPreviewCallbackWithBuffer 需要在startPreview()之前調用,因為 setPreviewCallbackWithBuffer 使用時需要指定一個位元組陣列作為緩衝區,用於預覽幀資料,所以我們需要在 setPreviewCallbackWithBuffer 之前調用 addCallbackBuffer,這樣 onPreviewFrame 的 data 才有值。

注意,如果程序中加入 previewCallback,在surfaceDestroy 釋放 camera 的時候,最好執行 myCamera.setOneShotPreviewCallback(null);或者 myCamera.setPreviewCallback(null);中止回調函數,然後再釋放 camera 便會更安全。否則可能會報錯。

2022年 3月 23日(Wed)天氣報告
氣溫:52.0°F / 11.0°C @ 07:00
風速:每小時 16公里
降雨機會:14%
相對濕度:百分之 91%
天氣:多雲

沒有留言:

張貼留言