Android CameraX 詳解二 (實(shí)時(shí)預(yù)覽)

機(jī)票直達(dá)

Android CameraX 詳解一 (引言&基礎(chǔ))
Android CameraX 詳解二 (實(shí)時(shí)預(yù)覽)
Android CameraX 詳解三 (拍照)
Android CameraX 詳解四 (圖片分析)
Android CameraX 詳解五(視頻拍攝錄制)

實(shí)時(shí)預(yù)覽

在向應(yīng)用添加預(yù)覽時(shí),請(qǐng)使用PreviewView這是一種可以剪裁、縮放和旋轉(zhuǎn)以確保正確顯示的 View。
當(dāng)相機(jī)處于活動(dòng)狀態(tài)時(shí),圖片預(yù)覽會(huì)流式傳輸?shù)?PreviewView 中的 Surface

使用PreviewView

如需使用 PreviewView 實(shí)現(xiàn) CameraX 預(yù)覽,請(qǐng)按以下步驟操作

  • 申請(qǐng)camera權(quán)限
  • PreviewView 添加到布局
<FrameLayout
    android:id="@+id/container">
        <androidx.camera.view.PreviewView
            android:id="@+id/previewView" />
</FrameLayout>
  • 創(chuàng)建ProcessCameraProvider
import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

class MainActivity : AppCompatActivity() {
    private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>
    override fun onCreate(savedInstanceState: Bundle?) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    }
}
  • 在創(chuàng)建 View 時(shí),請(qǐng)檢查 ProcessCameraProvider
cameraProviderFuture.addListener(Runnable {
    val cameraProvider = cameraProviderFuture.get()
    bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(this))
  • 選擇相機(jī)并綁定生命周期和用例
fun bindPreview(cameraProvider : ProcessCameraProvider) {
    val preview = Preview.Builder() .build()

    val cameraSelector = CameraSelector.Builder()
          .requireLensFacing(CameraSelector.LENS_FACING_BACK)
          .build()

    preview.setSurfaceProvider(previewView.getSurfaceProvider())

    cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
}
  • bindToLifecycle()會(huì)返回一個(gè) Camera對(duì)象,可以控制相機(jī)輸出(如變焦和曝光),完成以上步驟,即可實(shí)現(xiàn)相機(jī)預(yù)覽

PreviewView的渲染模式

PreviewView 可以使用以下模式之一將預(yù)覽流渲染到目標(biāo) View 上:

  • PERFORMANCE是默認(rèn)模式。PreviewView 會(huì)使用 SurfaceView顯示視頻串流,但在某些情況下會(huì)回退為使用 TextureView。SurfaceView 具有專用的繪圖界面,該對(duì)象更有可能通過內(nèi)部硬件合成器實(shí)現(xiàn)硬件疊加層,尤其是當(dāng)預(yù)覽視頻上面沒有其他界面元素(如按鈕)時(shí)。通過使用硬件疊加層進(jìn)行渲染,視頻幀會(huì)避開 GPU 路徑,從而能降低平臺(tái)功耗并縮短延遲時(shí)間。

  • COMPATIBLE模式。在此模式下,PreviewView 會(huì)使用 TextureView;不同于 SurfaceView,該對(duì)象沒有專用的繪圖表面。因此,視頻要通過混合渲染,才能顯示。在這個(gè)額外的步驟中,應(yīng)用可以執(zhí)行額外的處理工作,例如不受限制地縮放和旋轉(zhuǎn)視頻。

您可以使用 PreviewView.setImplementationMode()選擇適合具體應(yīng)用的實(shí)現(xiàn)模式。如果默認(rèn)的 PERFORMANCE 模式不適合您的應(yīng)用,請(qǐng)參閱以下代碼示例,了解如何設(shè)置 COMPATIBLE 模式:

// previewView is a PreviewView instance
previewView.implementationMode = PreviewView.ImplementationMode.COMPATIBLE

PreviewView的縮放模式

當(dāng)預(yù)覽視頻分辨率與目標(biāo) PreviewView 的尺寸不同時(shí),視頻內(nèi)容需要通過剪裁操作或添加遮幅式黑邊來適應(yīng)視圖(保持原始寬高比)。為此,PreviewView 提供了以下 ScaleTypes

  • FIT_CENTER、FIT_STARTFIT_END,用于添加遮幅式黑邊。整個(gè)視頻內(nèi)容會(huì)調(diào)整(放大或縮小)為可在目標(biāo) PreviewView 中顯示的最大尺寸。不過,雖然整個(gè)視頻幀會(huì)完整顯示,但屏幕畫面中可能會(huì)出現(xiàn)空白部分。視頻幀會(huì)與目標(biāo)視圖的中心、起始或結(jié)束位置對(duì)齊,具體取決于您在上述三種縮放類型中選擇了哪一種。

  • FILL_CENTER、FILL_STARTFILL_END,用于進(jìn)行剪裁。如果視頻的寬高比與 PreviewView 不匹配,畫面中只會(huì)顯示部分內(nèi)容,但視頻仍會(huì)填滿整個(gè) PreviewView。

CameraX 使用的默認(rèn)縮放類型是 FILL_CENTER。您可以使用 PreviewView.setScaleType()設(shè)置最適合具體應(yīng)用的縮放類型。下面的代碼示例設(shè)置了 FIT_CENTER 縮放類型:

// previewView is a PreviewView instance
previewView.scaleType = PreviewView.ScaleType.FIT_CENTER
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容