0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入了解CameraX 1.1版本的視頻拍攝功能

谷歌開(kāi)發(fā)者 ? 來(lái)源:谷歌開(kāi)發(fā)者 ? 作者:谷歌開(kāi)發(fā)者 ? 2022-01-25 12:01 ? 次閱讀

CameraX 是一個(gè) Jetpack 支持庫(kù),旨在幫助您簡(jiǎn)化相機(jī)應(yīng)用的開(kāi)發(fā)工作。它提供一致且易用的 API 接口,適用于大多數(shù) Android 設(shè)備,并可向后兼容至 Android 5.0 (API 級(jí)別 21)。我們將在本文中介紹 CameraX 1.1 的多項(xiàng)功能,比如視頻功能。

CameraX 概覽

CameraX 是一個(gè)為了簡(jiǎn)化編寫相機(jī)應(yīng)用而設(shè)計(jì)的支持庫(kù),它所提供的高級(jí) API 可以讓開(kāi)發(fā)者專注于和用戶交互而非相機(jī)的內(nèi)部實(shí)現(xiàn)。我們一直在探索并修復(fù)其背后復(fù)雜的兼容性問(wèn)題,讓每個(gè)新版本都得以在更多的設(shè)備上穩(wěn)定運(yùn)行。

何時(shí)使用 CameraX 或 Camera2,這取決于您期望更快的開(kāi)發(fā)速度或是想要更高的自定義程度。

CameraX 可以很方便地實(shí)現(xiàn)普通照片視頻的拍攝功能,而 Camera2 則可以對(duì)拍攝流程進(jìn)行特殊控制,例如實(shí)現(xiàn)多重曝光或全手動(dòng)捕獲;

CameraX 旨在消除不同設(shè)備間的差異并在不同設(shè)備上進(jìn)行了測(cè)試,而 Camera2 則需要應(yīng)用來(lái)管理不同設(shè)備間的差異并測(cè)試其行為;

CameraX 提升了代碼開(kāi)發(fā)速度,讓您更專注于用戶界面和體驗(yàn)流程,而 Camera2 則用于更深入地開(kāi)發(fā)以創(chuàng)造基于相機(jī)的定制功能;

CameraX 發(fā)布新版本頻繁,而 Camera2 則隨著 Android 的版本而更新;

CameraX 可以在您不熟悉相機(jī)的情況下也能夠進(jìn)行開(kāi)發(fā),而 Camera2 則需要您對(duì)相機(jī)的專業(yè)知識(shí)有更深層次的了解。

CameraX 基于主要的使用場(chǎng)景來(lái)構(gòu)建,比如實(shí)時(shí)預(yù)覽相機(jī)、檢索緩沖區(qū)以進(jìn)行分析和拍攝照片,在 CameraX 1.1 版本中還加入了視頻拍攝功能。我們來(lái)看一個(gè)簡(jiǎn)單的 CameraX 示例:

fun bindPreview(cameraProvider : ProcessCameraProvider) {    // 使用 CameraX 創(chuàng)建 Preview 用例    var preview : Preview = Preview.Builder().build()
    // 創(chuàng)建 cameraSelector,它會(huì)在設(shè)備上搜索所需的相機(jī)    var cameraSelector : CameraSelector = CameraSelector.Builder()        // 在本例中,我們選擇搜索后置相機(jī)        .requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
    // 從 CameraX 的 CameraView 包中獲取 previewView 的句柄    // 利用此方法可以輕松的將相機(jī)內(nèi)容添加到視圖上    preview.setSurfaceProvider(previewView.getSurfaceProvider())
    // 將 preview 與其生命周期綁定    var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner,                                cameraSelector, preview)}

△ CameraX 代碼示例

CameraX 是生命周期感知型組件,這意味著它將自動(dòng)處理應(yīng)用的生命周期事件來(lái)實(shí)現(xiàn)開(kāi)始、停止、暫停和恢復(fù)。現(xiàn)在,應(yīng)用啟動(dòng)時(shí)屏幕上便會(huì)顯示實(shí)時(shí)預(yù)覽。

我們已于 2021 年 5 月發(fā)布了 1.0 穩(wěn)定版本,目前正在開(kāi)發(fā) 1.1 Alpha 版本并且很快將會(huì)進(jìn)入 Beta 階段。并且我們一如既往地不斷為新增設(shè)備推出兼容性修復(fù)程序,例如 1.0.1 和 1.0.2。

在 CameraX 1.1 版本中我們新增了開(kāi)發(fā)者呼聲很高的功能,具體而言,在本文中我們將重點(diǎn)介紹:

視頻拍攝

YUV 到 RGB 的轉(zhuǎn)換

Beta 版 Extensions API

一些需要了解的其它功能

視頻拍攝

在 CameraX 1.1 版本中我們加入了視頻拍攝功能,視頻拍攝 API (尚處于 Alpha 階段,細(xì)節(jié)可能會(huì)發(fā)生變化,但整體結(jié)構(gòu)基本會(huì)保持不變) 提供了錄制到文件等基本功能、可自動(dòng)適配每臺(tái)設(shè)備的 Quality Setting API,以及 Lifecycle Management API。接下來(lái)我們先來(lái)了解如何設(shè)定視頻拍攝功能,代碼示例如下:

// 創(chuàng)建 Recorderval recorder = Recorder.Builder()                       // 我們可以在此處使用 setQualitySelector 設(shè)置視頻質(zhì)量                       .setQualitySelector(...)                       .build()
// 使用新創(chuàng)建的 Recorder 創(chuàng)建 VideoCaptureval videoCapture = VideoCapture.withOutput(recorder)
// 將其與生命周期綁定cameraProvider.bindToLifecycle(    this, CameraSelector.DEFAULT_BACK_CAMERA, preview, videoCapture)
// 設(shè)定 VideoRecordEvent 監(jiān)聽(tīng)器val videoRecordEventListener = Consumer{    when (it) {        is VideoRecordEvent.Start -> {}        is VideoRecordEvent.Finalize -> {}        is VideoRecordEvent.Status -> {            // status 事件將會(huì)在錄制時(shí)持續(xù)更新            val stats: RecordingStats = it.recordingStats            // RecordingStats 中包含錄制文件的尺寸和時(shí)長(zhǎng)        }        is VideoRecordEvent.Pause -> {}        is VideoRecordEvent.Resume -> {}
// 指定輸出val mediaStoreOutput = MediaStoreOutputOptions.Builder(this.contentResolver,        MediaStore.Video.Media.EXTERNAL_CONTENT_URI)    .setContentValues(contentValues)    .build()
// 準(zhǔn)備錄制val activeRecording = videoCapture.output.prepareRecording(this, mediaStoreOutput)    // 關(guān)聯(lián)事件監(jiān)聽(tīng)器    .withEventListener(ContextCompat.getMainExecutor(this), videoRecordEventListener)    // 啟用音頻 (前提是此應(yīng)用已獲得音頻權(quán)限)    .withAudioEnabled()    // 開(kāi)始錄制.start()

△ 視頻拍攝示例

videoCapture 會(huì)在應(yīng)用啟動(dòng)時(shí)就緒,應(yīng)用可以使用 videoRecordEventListener 響應(yīng)開(kāi)始、結(jié)束、暫停和恢復(fù)等拍攝事件,其中 Status 事件會(huì)提供包括文件大小和持續(xù)時(shí)間的 RecordingStats。視頻拍攝可以輸出到 File、FileDescriptor 或 MediaStore,在本例中我們選擇 MediaStore。如果選擇啟用音頻,則需要此應(yīng)用已經(jīng)獲得音頻權(quán)限。調(diào)用 start() 開(kāi)始錄制為我們提供了 activeRecording 句柄,它可以用來(lái)暫停、恢復(fù)或停止錄制。您可以在 1.1 版本中試用這些 API。

YUV 至 RGB 的轉(zhuǎn)換

另一個(gè)呼聲很高的功能是 YUV 到 RGB 的轉(zhuǎn)換,我們來(lái)了解一下此功能。

相機(jī)通常以 YUV420 格式生成數(shù)據(jù),其中包括明亮度 (Luminance, Y)、色度 (Chroma, U, V) 和一些填充字節(jié)以將各行與有效的內(nèi)存步幅對(duì)齊。但是這種格式的圖像處理起來(lái)可能很麻煩,而現(xiàn)在 CameraX 可以將 ImageAnalysis 的輸出轉(zhuǎn)換為大家更熟悉的 RGBA 以方便處理。接下來(lái)我們看一個(gè)示例:

val imageAnalysis = ImageAnalysis.Builder()        .setTargetResolution(Size(1280, 720))        .setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST).build()

△ 從 ImageAnalysis 獲取 RGB 輸出

在示例代碼中,我們創(chuàng)建了 ImageAnalysis 實(shí)例,為圖像緩沖區(qū)指定了所需的分辨率和背壓策略,并調(diào)用新的 setOutputImageFormat 方法以請(qǐng)求 RGBA 8888 格式的輸出?,F(xiàn)在,ImageAnalysis 輸出的幀為 RGBA 8888 數(shù)據(jù)而不再是 YUV 格式。

CameraX 中 YUV 到 RGB 的轉(zhuǎn)換基于 libyuv。此外,在 CameraX 1.1 版本中數(shù)據(jù)本身可以轉(zhuǎn)換到目標(biāo)分辨率。在中端設(shè)備上對(duì)圖像大小為 640x480 至 1080p 的數(shù)據(jù)進(jìn)行轉(zhuǎn)換大約需要 5~10 毫秒,具體性能因設(shè)備而異。此外 APK 會(huì)略微增加 50KB 左右。

修復(fù)單像素漂移

YUV 轉(zhuǎn)換還修復(fù)了部分設(shè)備上存在的單像素漂移問(wèn)題。在這些設(shè)備上,YUV 輸出經(jīng)過(guò)桶形移位一個(gè)像素,導(dǎo)致最右邊的一列數(shù)據(jù)出現(xiàn)在圖像的左邊緣。在已知會(huì)發(fā)生這種情況的設(shè)備上,進(jìn)行 YUV 到 RGB 的轉(zhuǎn)換及輸出 YUV 或 RGB 都會(huì)被修復(fù),并且 CameraX 將會(huì)持續(xù)對(duì)更多有需要的設(shè)備進(jìn)行修復(fù)。

CameraX Extensions API

相機(jī)特效在 CameraX 1.1 中的 CameraX Extensions API 可以更為充分地發(fā)揮設(shè)備強(qiáng)大的功能。

CameraX Extensions 包括一些最常見(jiàn)的內(nèi)置相機(jī)特效:

BOKEH (焦外虛化): 在人像模式下拍攝照片時(shí),讓前景人物更清晰。

HDR (高動(dòng)態(tài)范圍): 拍照時(shí)使用不同的自動(dòng)曝光 (AE) 配置,以獲得最佳效果。

NIGHT (夜間): 在低照度環(huán)境下 (通常是在夜間) 捕獲最佳靜態(tài)圖像。

FACE RETOUCH (臉部照片修復(fù)): 拍攝靜態(tài)圖像時(shí),修飾臉部膚色、輪廓等。

AUTO (自動(dòng)): 根據(jù)周圍的景色自動(dòng)調(diào)整最終圖像。

我們來(lái)看看如何使用 CameraX Extensions API:

// 獲取后置相機(jī)列表val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
// 檢查所有的后置相機(jī)中是否有支持焦外虛化if (extensionsManager.isExtensionAvailable(    cameraProvider,    cameraSelector,    ExtensionMode.BOKEH)) {    // 創(chuàng)建擴(kuò)展 cameraSelector,我們提供了相機(jī)并指定焦外虛化模式    // 它將開(kāi)始在后臺(tái)搜索支持焦外虛化的后置相機(jī)    val bokehCameraSelector = extensionsManager.getExtensionCameraSelector(        cameraProvider,        cameraSelector,        ExtensionMode.BOKEH    )
    // 創(chuàng)建 imageCapture 和 preview    val imageCapture = ImageCapture.Builder().builder()    val preview = Preview.Builder().build()
    // 使用 bokehCameraSelector 將它們綁定到生命周期    cameraProvider.bindToLifecycle(lifecycleOwner,        bokehCameraSelector,        imageCapture,        preview    )}
△ 以 BOKEH 效果捕捉并預(yù)覽圖像

在上面的例子中,imageCapture 輸出的圖像將會(huì)具有焦外虛化效果,如果設(shè)備支持的話,preview 也將預(yù)覽焦外虛化效果。

曝光補(bǔ)償

CameraX 1.1 中還添加了曝光補(bǔ)償 API,此功能可以幫助用戶更好地捕捉過(guò)度曝光或者曝光不足的區(qū)域。

如圖所示我們所處的場(chǎng)景窗外很明亮而室內(nèi)很昏暗,此時(shí)則可以調(diào)整曝光補(bǔ)償來(lái)更好地捕捉明亮的室外或昏暗的室內(nèi)場(chǎng)景。我們來(lái)看一個(gè)例子:

// 創(chuàng)建變量來(lái)跟蹤 exposureIndex 值var exposureIndex = 0// 使用 cameraSelector 將 imageCapture 和 preview 綁定到生命周期val camera = cameraProvider.bindToLifecycle(    lifecycleOwner,    getCameraSelector(),    preview,    imageCapture) // 為視圖中的按鈕添加點(diǎn)擊事件evButton.setOnclickListener {     // 檢查有效的范圍以防止可能的異常    val range = camera.cameraInfo.exposureState.exposureCompensationRange     if (range.contains(exposureIndex + 1)) {        // 調(diào)用 camera.cameraControl 的 setExposureCompenstation() 方法來(lái)設(shè)置曝光補(bǔ)償        camera.cameraControl.setExposureCompenstation(++exposureIndex)        // 使用 exposureCompensationStep 來(lái)實(shí)現(xiàn)從 index 到 EV 到轉(zhuǎn)換        val ev = camera.cameraInfo.exposureState.exposureCompensationStep.toFloat() * exposureIndex        Log.i("CameraXLog", "EV: $ev")    }}

△ 通過(guò)按鈕調(diào)整曝光

其中 exposureIndex 是一個(gè)與設(shè)備無(wú)關(guān)的數(shù)字,它將以硬件允許的最小步長(zhǎng)遞增或遞減曝光值,因此可以在不同的設(shè)備上以類似的方式運(yùn)作。如果您想向用戶展示 EV 值,可以獲取 exposureCompensationStep 來(lái)實(shí)現(xiàn)轉(zhuǎn)換。

平滑縮放

在 CameraX 1.1 中,我們還增加了平滑縮放功能。有一些設(shè)備有包括廣角和長(zhǎng)焦在內(nèi)的多個(gè)鏡頭,CameraX 可以檢測(cè)這些設(shè)備是否支持 SMOOTH_ZOOM 框架,在受支持的設(shè)備上使用 CameraX 的縮放控件時(shí),會(huì)自動(dòng)使用所有的相機(jī)來(lái)實(shí)現(xiàn)更大的縮放范圍。如果您已經(jīng)在使用這個(gè)縮放控件,那當(dāng)您使用 1.1 版本進(jìn)行編譯時(shí),您的應(yīng)用應(yīng)該就可以訪問(wèn)這些設(shè)備上的所有相機(jī)。

CameraX 1.1 的更多功能

接下來(lái)介紹我們?cè)?1.1 中添加的更多功能。

CameraState API 現(xiàn)在可以提供諸如另一個(gè)應(yīng)用正在使用相機(jī)或者正處于勿擾模式等更多有關(guān)相機(jī)狀態(tài)的信息,使得應(yīng)用能夠圍繞不同的相機(jī)時(shí)間來(lái)設(shè)計(jì)更好的界面和用戶體驗(yàn)流程。Image Analysis 現(xiàn)在可以提供超過(guò) 1080p 的圖像。Logging API 可以更詳細(xì)的調(diào)試日志并改善了錯(cuò)誤報(bào)告。Coordinate Transformation API 可以將不同用例間的坐標(biāo)關(guān)聯(lián)起來(lái),如果您在 imageAnalysis 緩沖區(qū)中定位了興趣點(diǎn),便可以方便地在圖像捕捉的輸出或預(yù)覽中輕松找到它。您可以使用 CameraFilter API 來(lái)指定詳細(xì)的規(guī)則以選擇合適的相機(jī)。如果應(yīng)用只需要前置或者后置相機(jī),可以使用 AvailableCamerasLimiter 來(lái)加快啟動(dòng)時(shí)間。CameraControllerInfo 中可提供相機(jī)功能的更多詳細(xì)信息。

設(shè)備兼容性

CameraX 會(huì)持續(xù)關(guān)注設(shè)備兼容性,以便應(yīng)用在眾多設(shè)備上都能夠良好運(yùn)行。我們修復(fù)了很多諸如圖像拉伸、縮放不正確、圖像顛倒及關(guān)閉相機(jī)時(shí)意外輸出了綠色圖形等問(wèn)題。每個(gè) CameraX 的發(fā)布版本或補(bǔ)丁版本中都會(huì)添加此類修復(fù),最新的穩(wěn)定版為 1.0.2。

您可以在版本記錄中看到每個(gè)版本中的詳細(xì)變更,還可以在問(wèn)題跟蹤器中看已經(jīng)修復(fù)的問(wèn)題。

希望對(duì) CameraX 1.1 版本的簡(jiǎn)要介紹對(duì)大家有所幫助,非常期待看到大家使用 CameraX 構(gòu)建的功能!

原文標(biāo)題:CameraX 1.1 有哪些新的特性發(fā)布?

文章出處:【微信公眾號(hào):谷歌開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3903

    瀏覽量

    126620
  • 相機(jī)
    +關(guān)注

    關(guān)注

    4

    文章

    1303

    瀏覽量

    53136
  • 設(shè)備
    +關(guān)注

    關(guān)注

    2

    文章

    4347

    瀏覽量

    70272

原文標(biāo)題:CameraX 1.1 有哪些新的特性發(fā)布?

文章出處:【微信號(hào):Google_Developers,微信公眾號(hào):谷歌開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    深入了解示波器

    深入了解示波器
    發(fā)表于 11-14 22:32

    專家開(kāi)講:深入了解電池技術(shù) ──Part 1

    。筆者不會(huì)一一詳細(xì)介紹所有的電池技術(shù),只選擇一些常見(jiàn)或是值得認(rèn)識(shí)的;而在接下來(lái)的專欄里,筆者將開(kāi)始介紹電池分類、常見(jiàn)規(guī)格以及專業(yè)術(shù)語(yǔ),如果你有特別想知道的電池技術(shù),歡迎留言!擴(kuò)展閱讀:專家開(kāi)講:深入了解
    發(fā)表于 08-18 09:33

    專家開(kāi)講:深入了解電池技術(shù)──Part 3

    資深工程師 Ivan Cowie 的「深入了解電池技術(shù)」專欄Part 3來(lái)啰!這次要介紹的是鉛酸電池(lead-acidbatteries)技術(shù)。鉛酸電池是在1859年由法國(guó)物理學(xué)家Gaston
    發(fā)表于 08-18 09:37

    單片機(jī)的深入了解!

    項(xiàng)目名稱:?jiǎn)纹瑱C(jī)的深入了解!項(xiàng)目是否開(kāi)源:否申請(qǐng)開(kāi)發(fā)板數(shù)量:1 塊申請(qǐng)人團(tuán)隊(duì)介紹:我們團(tuán)隊(duì)由五個(gè)人組成,我們打算開(kāi)始著手單片機(jī)的程序改編,設(shè)計(jì)一些比較特殊新穎的東西!希望給以支持!
    發(fā)表于 10-12 20:00

    深入了解LabVIEW FPGA資料分享

    深入了解LabVIEW FPGA
    發(fā)表于 05-27 08:35

    Zigbee各版本對(duì)比,讓你深入了解

    Zigbee各版本對(duì)比,讓你深入了解ZigBee是基于IEEE802.15.4標(biāo)準(zhǔn)的低功耗局域網(wǎng)協(xié)議。根據(jù)國(guó)際標(biāo)準(zhǔn)規(guī)定,ZigBee技術(shù)是一種短距離、低功耗的無(wú)線通信技術(shù)。這一名稱(又稱紫蜂協(xié)議
    發(fā)表于 02-29 11:24

    深入了解示波器(入門手冊(cè)),pdf版本

    本帖最后由 alpha007 于 2016-10-24 14:49 編輯 深入了解示波器(入門手冊(cè)),pdf版本
    發(fā)表于 07-07 09:53

    示波器的深入了解

    示波器的深入了解 引言自然界運(yùn)行著各種形式的正弦波,比如海浪、地震、聲波、爆破、空氣中傳播的聲音,或者身體運(yùn)轉(zhuǎn)的自然節(jié)律。物理世界里,能
    發(fā)表于 11-04 11:53 ?52次下載
    示波器的<b class='flag-5'>深入了解</b>

    深入了解示波器入門手冊(cè)

    深入了解示波器入門手冊(cè)
    發(fā)表于 03-27 17:43 ?241次下載
    <b class='flag-5'>深入了解</b>示波器入門手冊(cè)

    深入了解電路噪聲的那些事

    模擬電子的相關(guān)知識(shí)學(xué)習(xí)教材資料——深入了解電路噪聲的那些事
    發(fā)表于 09-27 15:19 ?0次下載

    深入了解電感與磁珠的異同

    模擬電子的相關(guān)知識(shí)學(xué)習(xí)教材資料——深入了解電感與磁珠的異同
    發(fā)表于 09-27 15:19 ?0次下載

    深入了解Room 2.4.0版本的新增功能

    對(duì) Room 有著更高的期望,我們也致力于此,在 2.2.0 - 2.4.0 版本中發(fā)布了很多開(kāi)發(fā)者們期待的新功能!包括自動(dòng)化遷移,關(guān)系查詢方法以及支持 Kotlin Symbol Processing (KSP) 等等。下面我們就來(lái)逐一介紹這些新
    的頭像 發(fā)表于 01-25 11:07 ?2716次閱讀

    帶你深入了解示波器

    帶你深入了解示波器
    發(fā)表于 02-07 14:26 ?18次下載

    深入了解安全光柵

    深入了解安全光柵
    的頭像 發(fā)表于 06-25 13:53 ?1027次閱讀
    <b class='flag-5'>深入了解</b>安全光柵

    深入了解 GaN 技術(shù)

    深入了解 GaN 技術(shù)
    的頭像 發(fā)表于 12-06 17:28 ?5901次閱讀
    <b class='flag-5'>深入了解</b> GaN 技術(shù)