Tin tức về sản phẩm

Giới thiệu CameraX 1.5: Quay video mạnh mẽ và chụp ảnh chuyên nghiệp

Đọc trong 7 phút
Scott Nien
Kỹ sư phần mềm

Nhóm CameraX rất vui mừng thông báo về việc phát hành phiên bản 1.5! Bản cập nhật mới nhất này tập trung vào việc cung cấp các tính năng chuyên nghiệp cho bạn, đồng thời giúp bạn dễ dàng định cấu hình phiên camera hơn bao giờ hết.

Đối với quay video, giờ đây, người dùng có thể dễ dàng quay được những video chuyển động chậm hoặc video có tốc độ khung hình cao tuyệt đẹp. Quan trọng hơn, Feature Group API mới cho phép bạn tự tin bật các tổ hợp phức tạp như HDR 10 bit và 60 FPS, đảm bảo kết quả nhất quán trên các thiết bị được hỗ trợ.

Về chụp ảnh, bạn có thể linh hoạt tối đa nhờ khả năng hỗ trợ chụp các tệp DNG (RAW) chưa xử lý và chưa nén. Ngoài ra, giờ đây, bạn có thể tận dụng đầu ra Ultra HDR ngay cả khi sử dụng các Tiện ích camera mạnh mẽ.

Nền tảng của các tính năng này là SessionConfig API mới, giúp đơn giản hoá quá trình thiết lập và định cấu hình lại camera. Bây giờ, hãy cùng tìm hiểu chi tiết về những tính năng mới thú vị này.

Quay video chất lượng cao: Tốc độ cao và kết hợp nhiều tính năng

CameraX 1.5 mở rộng đáng kể các chức năng video, cho phép bạn có trải nghiệm ghi hình sáng tạo và mạnh mẽ hơn.

Video chuyển động chậm và video có tốc độ khung hình cao

Giờ đây, bạn có thể sử dụng một trong những tính năng được mong chờ nhất của chúng tôi: video chuyển động chậm. Giờ đây, bạn có thể quay video ở tốc độ cao (ví dụ: 120 hoặc 240 khung hình/giây) và mã hoá trực tiếp thành một video chuyển động chậm ấn tượng. Ngoài ra, bạn có thể quay ở cùng tốc độ khung hình cao để tạo ra video mượt mà vượt trội.

Việc triển khai này rất đơn giản nếu bạn đã quen với API VideoCapture.

1. Kiểm tra xem có hỗ trợ tốc độ cao hay không: Sử dụng phương thức Recorder.getHighSpeedVideoCapabilities() mới để truy vấn xem thiết bị có hỗ trợ tính năng này hay không.

val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)

val highSpeedCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)

if (highSpeedCapabilities == null) {
    // This camera device does not support high-speed video.
    return
}

2. Định cấu hình và liên kết trường hợp sử dụng: Sử dụng videoCapabilities được trả về (chứa thông tin về chất lượng video được hỗ trợ) để tạo HighSpeedVideoSessionConfig. Sau đó, bạn phải truy vấn các dải tốc độ khung hình được hỗ trợ thông qua cameraInfo.getSupportedFrameRateRanges() và đặt dải tốc độ khung hình mong muốn. Gọi setSlowMotionEnabled(true) để quay video chuyển động chậm, nếu không, video sẽ được quay ở tốc độ khung hình cao. Bước cuối cùng là sử dụng Recorder.prepareRecording().start() thông thường để bắt đầu ghi video.

val preview = Preview.Builder().build()
val quality = highSpeedCapabilities
        .getSupportedQualities(DynamicRange.SDR).first()

val recorder = Recorder.Builder()
      .setQualitySelector(QualitySelector.from(quality)))
      .build()

val videoCapture = VideoCapture.withOutput(recorder)

val frameRateRange = cameraInfo.getSupportedFrameRateRanges(      
       HighSpeedVideoSessionConfig(videoCapture, preview)
).first()

val sessionConfig = HighSpeedVideoSessionConfig(
    videoCapture, 
    preview, 
    frameRateRange = frameRateRange, 
    // Set true for slow-motion playback, or false for high-frame-rate
    isSlowMotionEnabled = true
)

cameraProvider.bindToLifecycle(
     lifecycleOwner, cameraSelector, sessionConfig)

// Start recording slow motion videos. 
val recording = recorder.prepareRecording(context, outputOption)
      .start(executor, {})

Khả năng tương thích và các hạn chế

Tính năng ghi hình tốc độ cao yêu cầu phải có chế độ hỗ trợ CameraConstrainedHighSpeedCaptureSessionCamcorderProfile cụ thể. Luôn thực hiện kiểm tra khả năng và chỉ bật tính năng ghi hình tốc độ cao trên các thiết bị được hỗ trợ để tránh trải nghiệm người dùng kém. Hiện tại, tính năng này được hỗ trợ trên camera sau của hầu hết các thiết bị Pixel và một số mẫu của các nhà sản xuất khác.

Hãy xem bài đăng trên blog để biết thêm chi tiết.

Kết hợp các tính năng một cách tự tin: Feature Group API

CameraX 1.5 ra mắt Feature Group API, giúp bạn không cần phải đoán khả năng tương thích của tính năng. Dựa trên API truy vấn tổ hợp tính năng của Android 15, giờ đây, bạn có thể tự tin bật nhiều tính năng cùng lúc, đảm bảo phiên máy ảnh ổn định. Nhóm tính năng hiện hỗ trợ: HDR (HLG), 60 khung hình/giây, tính năng Xem trước chế độ ổn định và Ultra HDR. Ví dụ: bạn có thể bật đồng thời chế độ HDR, 60 khung hình/giây và tính năng Ổn định bản xem trước trên dòng Pixel 10 và Galaxy S25. Các điểm cải tiến trong tương lai dự kiến sẽ bao gồm tính năng quay video 4K và thu phóng siêu rộng. 

Feature Group API hỗ trợ 2 trường hợp sử dụng thiết yếu:

Trường hợp sử dụng 1: Ưu tiên chất lượng tốt nhất

Nếu muốn chụp ảnh bằng cách sử dụng tổ hợp tính năng tốt nhất có thể, bạn có thể cung cấp một danh sách được ưu tiên. CameraX sẽ cố gắng bật các chế độ này theo thứ tự, chọn tổ hợp đầu tiên mà thiết bị hỗ trợ đầy đủ.

val sessionConfig = SessionConfig(
    useCases = listOf(preview, videoCapture),
    preferredFeatureGroup = listOf(
        GroupableFeature.HDR_HLG10,
        GroupableFeature.FPS_60,
        GroupableFeature.PREVIEW_STABILIZATION
    )
).apply {
    // (Optional) Get a callback with the enabled features to update your UI.
    setFeatureSelectionListener { selectedFeatures ->
        updateUiIndicators(selectedFeatures)
    }
}
processCameraProvider.bindToLifecycle(activity, cameraSelector, sessionConfig)

Trong ví dụ này, CameraX sẽ cố gắng bật các tính năng theo thứ tự sau:

  1. HDR + 60 khung hình/giây + Chống rung khi xem trước
  2. HDR + 60 khung hình/giây
  3. HDR + Chống rung khi xem trước
  4. HDR
  5. 60 khung hình/giây + Chống rung khi xem trước
  6. 60 khung hình/giây
  7. Chống rung khi xem trước
  8. Không có

Trường hợp sử dụng 2: Xây dựng giao diện người dùng Cài đặt cho người dùng

Giờ đây, bạn có thể phản ánh chính xác những tổ hợp tính năng được hỗ trợ trong giao diện người dùng cài đặt của ứng dụng, đồng thời tắt các nút bật/tắt cho những lựa chọn không được hỗ trợ, chẳng hạn như hình ảnh bên dưới. 

unsupported-features-disabled.gif

Để xác định xem có nên làm mờ một nút bật/tắt hay không, hãy dùng các mã sau để kiểm tra khả năng hỗ trợ tổ hợp tính năng. Ban đầu, hãy truy vấn trạng thái của từng tính năng riêng lẻ. Sau khi bật một tính năng, hãy truy vấn lại các tính năng còn lại bằng các tính năng đã bật để xem liệu các nút bật/tắt của chúng có cần chuyển sang màu xám do các hạn chế về khả năng tương thích hay không.

fun disableFeatureIfNotSuported(
   enabledFeatures: Set<GroupableFeature>,     
   featureToCheck:GroupableFeature
) {
 val sessionConfig = SessionConfig(
     useCases = useCases,
     requiredFeatureGroup = enabledFeatures + featureToCheck
 )
 val isSupported = cameraInfo.isFeatureGroupSupported(sessionConfig)

 if (!isSupported) {
     // disable the toggle for featureToCheck
 }
}

Vui lòng tham khảo bài đăng trên blog về Nhóm tính năng để biết thêm thông tin. 

Các tính năng nâng cao khác cho video

  • Cải tiến camera đồng thời: Với CameraX 1.5.1, giờ đây, bạn có thể liên kết đồng thời các trường hợp sử dụng Preview + ImageCapture + VideoCapture cho mỗi SingleCameraConfigchế độ không kết hợp. Ngoài ra, trong chế độ kết hợp (các trường hợp sử dụng tương tự với CompositionSettings),  giờ đây, bạn có thể đặt CameraEffect được áp dụng cho kết quả kết hợp cuối cùng.
  • Tắt tiếng linh hoạt: Giờ đây, bạn có thể bắt đầu ghi ở trạng thái tắt tiếng bằng cách sử dụng PendingRecording.withAudioEnabled(boolean initialMuted) và cho phép người dùng bật tiếng sau bằng cách sử dụng Recording.mute(boolean muted).
  • Cải thiện khả năng xử lý tình trạng thiếu bộ nhớ: CameraX hiện gửi lỗi VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE một cách đáng tin cậy, cho phép ứng dụng của bạn xử lý tình trạng bộ nhớ thấp một cách hiệu quả và thông báo cho người dùng.
  • Tăng cường ánh sáng yếu: Trên các thiết bị được hỗ trợ (như dòng Pixel 10), bạn có thể bật CameraControl.enableLowLightBoostAsync để tự động tăng độ sáng cho bản xem trước và luồng video trong môi trường tối.

Chụp ảnh chuyên nghiệp

CameraX 1.5 mang đến những nâng cấp lớn cho ImageCapture đối với những nhà phát triển yêu cầu chất lượng và tính linh hoạt tối đa.

Thoả sức sáng tạo với chế độ chụp DNG (RAW)

Để kiểm soát hoàn toàn quá trình xử lý hậu kỳ, CameraX hiện hỗ trợ tính năng chụp DNG (RAW). Nhờ đó, bạn có thể truy cập vào dữ liệu hình ảnh chưa xử lý, chưa nén trực tiếp từ cảm biến camera, cho phép chỉnh sửa và phân loại màu ở cấp độ chuyên nghiệp. API này hỗ trợ chụp riêng tệp DNG hoặc chụp đồng thời đầu ra JPEG và DNG. Hãy xem mã mẫu bên dưới để biết cách chụp đồng thời các tệp JPEG và DNG.

val capabilities = ImageCapture.getImageCaptureCapabilities(cameraInfo)
val imageCapture = ImageCapture.Builder().apply {
    if (capabilities.supportedOutputFormats
             .contains(OUTPUT_FORMAT_RAW_JPEG)) {
        // Capture both RAW and JPEG formats.
        setOutputFormat(OUTPUT_FORMAT_RAW_JPEG)
    }
}.build()
// ... bind imageCapture to lifecycle ...


// Provide separate output options for each format.
val outputOptionRaw = /* ... configure for image/x-adobe-dng ... */
val outputOptionJpeg = /* ... configure for image/jpeg ... */
imageCapture.takePicture(
    outputOptionRaw,
    outputOptionJpeg,
    executor,
    object : ImageCapture.OnImageSavedCallback {
        override fun onImageSaved(results: OutputFileResults) {
            // This callback is invoked twice: once for the RAW file
            // and once for the JPEG file.
        }

        override fun onError(exception: ImageCaptureException) {}
    }
)

Ultra HDR cho Tiện ích Camera

Tận hưởng cả hai lợi ích: khả năng chụp ảnh điện toán tuyệt đẹp của Tiện ích camera (chẳng hạn như Chế độ ban đêm) kết hợp với màu sắc rực rỡ và dải tương phản động của Ultra HDR. Tính năng này hiện được hỗ trợ trên nhiều điện thoại Android cao cấp gần đây, chẳng hạn như dòng Pixel 9/10 và dòng Samsung S24/S25.

// Support UltraHDR when Extension is enabled. 

val extensionsEnabledCameraSelector = extensionsManager
     .getExtensionEnabledCameraSelector(
        CameraSelector.DEFAULT_BACK_CAMERA, ExtensionMode.NIGHT)

val imageCapabilities = ImageCapture.getImageCaptureCapabilities(
               cameraProvider.getCameraInfo(extensionsEnabledCameraSelector)

val imageCapture = ImageCapture.Builder()
     .apply {
       if (imageCapabilities.supportedOutputFormats
                .contains(OUTPUT_FORMAT_JPEG_ULTRA_HDR) {
           setOutputFormat(OUTPUT_FORMAT_JPEG_ULTRA_HDR)

       }

     }.build()

API cốt lõi và các tính năng giúp tăng cường khả năng hữu dụng

Cách định cấu hình mới: SessionConfig

Như bạn thấy trong các ví dụ trên, SessionConfig là một khái niệm mới trong CameraX 1.5. Nền tảng này tập trung cấu hình và đơn giản hoá API theo hai cách chính:

  1. Không còn phải gọi unbind() theo cách thủ công: Các API CameraX nhận biết được vòng đời. Thao tác này sẽ ngầm "huỷ liên kết" các trường hợp sử dụng của bạn khi hoạt động hoặc LifecycleOwner khác bị huỷ. Tuy nhiên, việc cập nhật các trường hợp sử dụng hoặc chuyển đổi camera vẫn yêu cầu bạn gọi unbind() hoặc unbindAll() trước khi liên kết lại. Giờ đây, với CameraX 1.5, khi bạn liên kết một SessionConfig mới, CameraX sẽ cập nhật phiên một cách liền mạch cho bạn, giúp bạn không cần gọi lệnh huỷ liên kết.
  2. Cơ chế kiểm soát tốc độ khung hình có thể xác định: API SessionConfig mới giới thiệu một cách có thể xác định để quản lý tốc độ khung hình. Không giống như setTargetFrameRate trước đây (chỉ là một gợi ý), phương thức mới này đảm bảo rằng phạm vi tốc độ khung hình được chỉ định sẽ được áp dụng khi bạn định cấu hình thành công. Để đảm bảo độ chính xác, bạn phải truy vấn tốc độ khung hình được hỗ trợ bằng cách sử dụng CameraInfo.getSupportedFrameRateRanges(SessionConfig). Bằng cách truyền toàn bộ SessionConfig, CameraX có thể xác định chính xác các dải được hỗ trợ dựa trên cấu hình luồng.

Camera Compose hiện đã ổn định

Chúng tôi biết bạn yêu thích Jetpack Compose đến mức nào và rất vui mừng được thông báo rằng thư viện camera-compose hiện đã ổn định ở phiên bản 1.5.1! Bản phát hành này bao gồm các bản sửa lỗi quan trọng liên quan đến việc sử dụng CameraXViewfinder với các tính năng của Compose như moveableContentOfPager, cũng như giải quyết vấn đề về việc kéo giãn bản xem trước. Chúng tôi sẽ tiếp tục bổ sung thêm nhiều tính năng cho camera-compose trong các bản phát hành sau này.

Cải tiến ImageAnalysis và CameraControl

  • Điều chỉnh độ sáng của đèn pin: Có được quyền kiểm soát chi tiết đối với đèn pin của thiết bị bằng các API mới. Bạn có thể truy vấn cường độ tối đa được hỗ trợ bằng cách sử dụng CameraInfo.getMaxTorchStrengthLevel() rồi đặt cấp độ mong muốn bằng CameraControl.setTorchStrengthLevel().
  • Hỗ trợ NV21 trong ImageAnalysis: Giờ đây, bạn có thể yêu cầu định dạng hình ảnh NV21 trực tiếp từ ImageAnalysis, giúp đơn giản hoá việc tích hợp với các thư viện và API khác. Bạn có thể bật tính năng này bằng cách gọi ImageAnalysis.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21).

Bắt đầu ngay hôm nay

Hãy cập nhật các phần phụ thuộc lên CameraX 1.5 ngay hôm nay và khám phá các tính năng mới thú vị. Chúng tôi rất mong chờ được xem những nội dung bạn tạo ra.

Để sử dụng CameraX 1.5,  vui lòng thêm các phần phụ thuộc sau vào libs.versions.toml. (Bạn nên sử dụng phiên bản 1.5.1 vì phiên bản này chứa nhiều bản sửa lỗi quan trọng và cải thiện camera đồng thời.) 

[versions]

camerax = "1.5.1"


[libraries]

..

androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "camerax" }

androidx-camera-compose = { module = "androidx.camera:camera-compose", version.ref = "camerax" }

androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "camerax" }

androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" }

androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camerax" }

androidx-camera-extensions = { module = "androidx.camera:camera-extensions", version.ref = "camerax" }

Sau đó, hãy thêm các phần phụ thuộc này vào build.gradle.kts của mô-đun:

dependencies {

  ..

  implementation(libs.androidx.camera.core)
  implementation(libs.androidx.camera.lifecycle)

  implementation(libs.androidx.camera.camera2)

  implementation(libs.androidx.camera.view) // for PreviewView 
  implementation(libs.androidx.camera.compose) // for compose UI

  implementation(libs.androidx.camera.extensions) // For Extensions 

}

Bạn có thắc mắc hoặc muốn kết nối với nhóm CameraX? Tham gia nhóm thảo luận dành cho nhà phát triển CameraX hoặc gửi báo cáo lỗi:

Tác giả:

Tiếp tục đọc