操作說明

使用 CameraX 1.5 進行高速拍攝和慢動作影片拍攝

閱讀時間:6 分鐘
Leo Huang
軟體工程師

清楚捕捉快速移動的動作,是現代相機應用程式的重要功能。這項功能是透過高速擷取實現,也就是以每秒 120 或 240 格等速率擷取影格。這項高保真度擷取功能可用於兩種不同用途:建立高影格率影片,以逐格分析細節;或是生成慢動作影片,讓動作在畫面上以戲劇化的方式呈現。

先前使用 Camera2 API 實作這些功能時,需要更深入瞭解相關程序。現在,CameraX 1.5 的全新高速 API 可簡化整個程序,讓您彈性製作真正的高格率影片,或直接播放慢動作短片。這篇文章將說明如何精通這兩項功能。如果您是 CameraX 新手,可以先閱讀 CameraX 總覽


慢動作的原理

慢動作影片的基本原理,是以遠高於播放時的影格率拍攝影片。舉例來說,如果你以每秒 120 個影格錄製 1 秒的事件,然後以標準的每秒 30 個影格播放錄影內容,影片就會播放 4 秒。這種時間「拉長」的效果會產生戲劇性的慢動作效果,讓您看到肉眼無法辨識的細節。

為確保最終輸出影片流暢,通常應以至少 30 fps 的速度算繪。也就是說,如要製作 4 倍慢動作影片,原始擷取影格率必須至少為 120 fps (120 fps ÷ 4 = 30 fps)。

擷取高影格率影片片段後,主要有兩種方式可達到所需結果:

  • 由播放器處理的慢動作 (高畫面更新率影片):高速錄製 (例如 120 fps) 的影片會直接儲存為高畫面更新率影片檔案。接著,影片播放器會負責降低播放速度。使用者可靈活切換正常和慢動作播放模式。
  • 可播放的慢動作影片 (重新編碼的影片):系統會處理高速影片串流,並重新編碼為標準影格率 (例如 30 fps) 的檔案。系統會調整影格時間戳記,將慢動作效果「烘焙」到影片中。這樣一來,任何標準影片播放器都能以慢動作播放影片,無須特殊處理。影片預設會以慢動作播放,但影片播放器仍可提供播放速度控制項,讓使用者調快速度,以原始速度觀看影片。

CameraX API 提供統一的方式來選擇所需方法,簡化了這項程序,詳情請見下文。


全新高速視訊 API

新的 CameraX 解決方案以兩個主要元件為基礎:

  • Recorder#getHighSpeedVideoCapabilities(CameraInfo):這個方法可讓您檢查攝影機是否能以高速錄影,以及支援哪些解析度 (Quality 物件)。
  • HighSpeedVideoSessionConfig:這是特殊設定物件,可將 VideoCapturePreview 用途分組,並告知 CameraX 建立統一的高速攝影機工作階段。請注意,VideoCapture 串流會以設定的高影格率運作,但相機系統通常會將 Preview 串流限制為至少 30 FPS 的標準影格率,確保螢幕顯示畫面流暢。

開始使用

開始之前,請確認您已在應用程式的 build.gradle.kts 檔案中新增必要的 CameraX 依附元件。您需要 camera-video 構件和核心 CameraX 程式庫。

  // build.gradle.kts (Module: app)

dependencies {

    val camerax_version = "1.5.1"


    implementation("androidx.camera:camera-core:$camerax_version")

    implementation("androidx.camera:camera-camera2:$camerax_version")

    implementation("androidx.camera:camera-lifecycle:$camerax_version")

    implementation("androidx.camera:camera-video:$camerax_version")

    implementation("androidx.camera:camera-view:$camerax_version")

}

實驗性 API 注意事項

請注意,高速錄影 API 目前處於實驗階段。也就是說,這些 API 可能會在後續版本中有所變動。如要使用這些註解,請在程式碼中加入下列註解,選擇啟用:

  @kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)

實作

這兩種結果的實作方式都從相同的設定步驟開始。如要製作高格率影片或慢動作影片,只要調整單一設定即可。

1. 設定高速拍攝

首先,無論目標為何,您都需要取得 ProcessCameraProvider、檢查裝置功能,並建立用途。

下列程式碼區塊顯示暫停函式中的完整設定流程。您可以從協同程式範圍 (例如 lifecycleScope.launch) 呼叫此函式。

  // Add the OptIn annotation at the top of your function or class

@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)

private suspend fun setupCamera() {

    // Asynchronously get the CameraProvider

    val cameraProvider = ProcessCameraProvider.awaitInstance(this)



    // -- CHECK CAPABILITIES --

    val cameraInfo = cameraProvider.getCameraInfo(CameraSelector.DEFAULT_BACK_CAMERA)

    val videoCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)

    if (videoCapabilities == null) {

        // This camera device does not support high-speed video.

        return

    }




    // -- CREATE USE CASES --

    val preview = Preview.Builder().build()    


    // You can create a Recorder with default settings.

    // CameraX will automatically select a suitable quality.

    val recorder = Recorder.Builder().build()


    // Alternatively, to use a specific resolution, you can configure the
    // Recorder with a QualitySelector. This is useful if your app has
    // specific resolution requirements or you want to offer user
    // preferences. 

    // To use a specific quality, you can uncomment the following lines.

    // Get the list of qualities supported for high-speed video. 

    // val supportedQualities = videoCapabilities.getSupportedQualities(DynamicRange.SDR)

    // Build the Recorder using the quality from the supported list.

    // val recorderWithQuality = Recorder.Builder()

    //     .setQualitySelector(QualitySelector.from(supportedQualities.first()))

    //     .build()



    // Create the VideoCapture use case, using either recorder or recorderWithQuality

    val videoCapture = VideoCapture.withOutput(recorder)

    // Now you are ready to configure the session for your desired output...

}

2. 選擇輸出內容

現在,請決定要製作哪種影片。這段程式碼會在上述 setupCamera() suspend 函式中執行。

方法 A:製作高格率影片

如要讓最終檔案具有高影格率 (例如 120 fps 的影片),請選擇這個選項。

  // Create a builder for the high-speed session

val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture)

    .setPreview(preview)


// Query and apply a supported frame rate. Common supported frame rates include 120 and 240 fps.

val supportedFrameRateRanges =

    cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build())


sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())

選項 B:製作可直接播放的慢動作影片

如果希望影片在任何標準影片播放器中自動以慢動作播放,請選擇這個選項。

  // Create a builder for the high-speed session

val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture)

    .setPreview(preview)



// This is the key: enable automatic slow-motion!

sessionConfigBuilder.setSlowMotionEnabled(true)



// Query and apply a supported frame rate. Common supported frame rates include 120, 240, and 480 fps.

val supportedFrameRateRanges =

   cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build())

sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())

只要使用這個單一標記,就能建立可播放的慢動作影片。如果 setSlowMotionEnabled 為 true,CameraX 會處理高速串流,並儲存為標準 30 fps 影片檔。慢動作速度取決於擷取影格率與這個標準播放速率的比率。

例如:

  • 120 fps 錄製的影片會以 1/4 倍速播放 (120 ÷ 30 = 4)。
  • 240 fps 錄製的影片會以 1/8 倍速播放 (240 ÷ 30 = 8)。

整合所有項目:錄製影片

設定 HighSpeedVideoSessionConfig 並繫結至生命週期後,最後一步就是開始錄製。準備輸出選項、開始錄製及處理影片事件的程序,與標準影片擷取程序相同。

本文著重於高速設定,因此不會詳細說明錄製過程。如需從準備 FileOutputOptionsMediaStoreOutputOptions 物件到處理 VideoRecordEvent 回呼的完整指南,請參閱 VideoCapture 說明文件

  // Bind the session config to the lifecycle

cameraProvider.bindToLifecycle(

    this as LifecycleOwner,

    CameraSelector.DEFAULT_BACK_CAMERA,

    sessionConfigBuilder.build() // Bind the config object from Option A or B

)



// Start the recording using the VideoCapture use case

val recording = videoCapture.output

    .prepareRecording(context, outputOptions) // See docs for creating outputOptions

    .start(ContextCompat.getMainExecutor(context)) { recordEvent ->

        // Handle recording events (e.g., Start, Pause, Finalize)

    }

Google 相簿支援慢動作影片

在 CameraX 中啟用 setSlowMotionEnabled(true) 後,產生的影片檔案會立即以慢動作模式在標準影片播放器和相片庫應用程式中播放。如果拍攝慢動作影片時的影格率為 120、240、360、480 或 960 fps,Google 相簿會提供強化功能:

  • 縮圖中的獨特 UI 辨識:在 Google 相簿相片庫中,可透過特定 UI 元素辨識慢動作影片,與一般影片區別。
normal.png
  • 播放期間可調整速度的片段:播放慢動作影片時,Google 相簿會提供控制項,讓使用者調整影片中哪些部分以慢速播放,哪些部分以正常速度播放,提供創意控制權。接著,您可以使用「分享」按鈕將編輯後的影片匯出為新影片檔,並保留您定義的慢動作片段。
normal2.png

裝置支援注意事項

CameraX 的高速 API 會依據基礎 Android CamcorderProfile 系統,判斷裝置支援哪些高速解析度和影格速率。CamcorderProfile 會經過 Android 相容性測試套件 (CTS) 驗證,因此您可以放心使用裝置回報的影片錄製功能。

也就是說,裝置內建的相機應用程式可以錄製慢動作影片,並不保證 CameraX 高速 API 能正常運作。造成這種差異的原因是,裝置製造商負責在裝置韌體中填入 CamcorderProfile 項目,但有時會未納入必要的 CamcorderProfile.QUALITY_HIGH_SPEED_1080PCamcorderProfile.QUALITY_HIGH_SPEED_720P 等高速設定檔。如果缺少這些設定檔,Recorder.getHighSpeedVideoCapabilities() 會傳回 null

因此,請務必一律使用 Recorder.getHighSpeedVideoCapabilities() 以程式輔助方式檢查支援的功能,這是確保不同裝置提供一致體驗最可靠的方法。如果您嘗試在 Recorder.getHighSpeedVideoCapabilities() 傳回空值的裝置上繫結 HighSpeedVideoSessionConfig,作業會失敗並傳回 IllegalArgumentExceptionGoogle Pixel 裝置一律支援這些高速設定檔,因此你可以確認裝置是否支援。此外,Motorola Edge 30、OPPO Find N2 Flip 和 Sony Xperia 1 V 等其他製造商的各種裝置,也支援高速影片功能。


結論

CameraX 高速影片 API 功能強大且彈性十足,無論您是需要真正高影格率的影片片段進行技術分析,還是想在應用程式中加入電影般的慢動作效果,HighSpeedVideoSessionConfig 都能提供簡單易用的統一解決方案。瞭解 setSlowMotionEnabled 標記的角色後,您就能輕鬆支援這兩種用途,並讓使用者有更多創意控制權。

撰寫者:

繼續閱讀