Hướng dẫn
Tính năng Chụp tốc độ cao và quay video chuyển động chậm bằng CameraX 1.5
Đọc trong 6 phút
Ghi lại cảnh hành động chuyển động nhanh một cách rõ ràng là một tính năng chính của các ứng dụng camera hiện đại. Điều này đạt được thông qua tính năng chụp tốc độ cao – quá trình thu thập khung hình ở tốc độ như 120 hoặc 240 khung hình/giây. Bạn có thể sử dụng tính năng ghi hình có độ trung thực cao này cho 2 mục đích riêng biệt: tạo video có tốc độ khung hình cao để phân tích chi tiết từng khung hình hoặc tạo video chuyển động chậm, trong đó hành động diễn ra một cách kịch tính trên màn hình.
Trước đây, việc triển khai các tính năng này bằng Camera2 API là một quy trình thực hiện thủ công hơn. Giờ đây, với API tốc độ cao mới trong CameraX 1.5, toàn bộ quy trình sẽ được đơn giản hoá, giúp bạn linh hoạt tạo video có tốc độ khung hình cao thực sự hoặc các đoạn video chuyển động chậm sẵn sàng phát. Bài đăng này sẽ hướng dẫn bạn cách sử dụng thành thạo cả hai. Đối với những người mới làm quen với CameraX, bạn có thể tìm hiểu nhanh qua bài viết Tổng quan về CameraX.
Nguyên tắc đằng sau chế độ chuyển động chậm
Nguyên tắc cơ bản của hiệu ứng chuyển động chậm là quay video ở tốc độ khung hình cao hơn nhiều so với tốc độ phát. Ví dụ: nếu bạn quay một sự kiện kéo dài 1 giây ở tốc độ 120 khung hình/giây (fps) rồi phát lại bản ghi đó ở tốc độ tiêu chuẩn là 30 fps, thì video sẽ mất 4 giây để phát. Việc "kéo dài" thời gian này tạo ra hiệu ứng chuyển động chậm kịch tính, giúp bạn nhìn thấy những chi tiết quá nhanh mà mắt thường không thể thấy được.
Để đảm bảo video đầu ra cuối cùng mượt mà và trôi chảy, video đó thường phải được kết xuất ở tốc độ tối thiểu là 30 khung hình/giây. Điều này có nghĩa là để tạo video chuyển động chậm gấp 4 lần, tốc độ khung hình ghi hình ban đầu phải ít nhất là 120 khung hình/giây (120 khung hình/giây ghi hình ÷ 4 = 30 khung hình/giây phát).
Sau khi quay được cảnh quay có tốc độ khung hình cao, bạn có thể thực hiện theo 2 cách chính để đạt được kết quả mong muốn:
- Video chuyển động chậm do trình phát xử lý (Video có tốc độ khung hình cao): Bản ghi hình tốc độ cao (ví dụ: 120 khung hình/giây) được lưu trực tiếp dưới dạng tệp video có tốc độ khung hình cao. Sau đó, trình phát video sẽ có trách nhiệm giảm tốc độ phát. Điều này giúp người dùng linh hoạt chuyển đổi giữa chế độ phát bình thường và chế độ phát chuyển động chậm.
- Video chuyển động chậm sẵn sàng phát (Video được mã hoá lại): Luồng video tốc độ cao được xử lý và mã hoá lại thành một tệp có tốc độ khung hình tiêu chuẩn (ví dụ: 30 khung hình/giây). Hiệu ứng chuyển động chậm được "tạo sẵn" bằng cách điều chỉnh dấu thời gian của khung hình. Video tạo ra sẽ phát ở chế độ chuyển động chậm trong mọi trình phát video tiêu chuẩn mà không cần xử lý đặc biệt. Mặc dù video phát ở chế độ chuyển động chậm theo mặc định, nhưng trình phát video vẫn có thể cung cấp các nút điều khiển tốc độ phát để người dùng tăng tốc độ và xem video ở tốc độ ban đầu.
API CameraX đơn giản hoá việc này bằng cách cung cấp cho bạn một cách thức thống nhất để chọn phương pháp bạn muốn, như bạn sẽ thấy bên dưới.
API video tốc độ cao mới
Giải pháp CameraX mới được xây dựng dựa trên 2 thành phần chính:
Recorder#getHighSpeedVideoCapabilities(CameraInfo): Phương thức này cho phép bạn kiểm tra xem camera có thể quay video ở tốc độ cao hay không và nếu có thì camera hỗ trợ những độ phân giải nào (đối tượngQuality).HighSpeedVideoSessionConfig: Đây là một đối tượng cấu hình đặc biệt, nhóm các trường hợp sử dụngVideoCapturevàPreview, cho CameraX biết để tạo một phiên máy ảnh tốc độ cao hợp nhất. Xin lưu ý rằng mặc dù luồng VideoCapture sẽ hoạt động ở tốc độ khung hình cao đã định cấu hình, nhưng luồng Xem trước thường sẽ bị hệ thống camera giới hạn ở tốc độ tiêu chuẩn là ít nhất 30 khung hình/giây để đảm bảo màn hình hiển thị mượt mà.
Bắt đầu
Trước khi bắt đầu, hãy đảm bảo bạn đã thêm các phần phụ thuộc CameraX cần thiết vào tệp build.gradle.kts của ứng dụng. Bạn sẽ cần cấu phần phần mềm camera-video cùng với các thư viện CameraX cốt lõi.
// 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")
}Lưu ý về API thử nghiệm
Điều quan trọng cần lưu ý là các API ghi hình tốc độ cao hiện đang trong giai đoạn thử nghiệm. Điều này có nghĩa là các API này có thể thay đổi trong các bản phát hành sau này. Để sử dụng các chú thích này, bạn phải chọn sử dụng bằng cách thêm chú thích sau vào mã của mình:
@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)
Triển khai
Việc triển khai cho cả hai kết quả đều bắt đầu bằng các bước thiết lập giống nhau. Việc chọn tạo video có tốc độ khung hình cao hay video chuyển động chậm chỉ phụ thuộc vào một chế độ cài đặt duy nhất.
1. Thiết lập tính năng Chụp tốc độ cao
Trước tiên, bất kể mục tiêu của bạn là gì, bạn cần phải lấy ProcessCameraProvider, kiểm tra các chức năng của thiết bị và tạo các trường hợp sử dụng.
Khối mã sau đây cho thấy quy trình thiết lập hoàn chỉnh trong một hàm tạm ngưng. Bạn có thể gọi hàm này từ một phạm vi coroutine, chẳng hạn như 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. Chọn đầu ra
Giờ đây, bạn có thể quyết định loại video mà mình muốn tạo. Đoạn mã này sẽ chạy trong hàm setupCamera() suspend như minh hoạ ở trên.
Cách A: Tạo video có tốc độ khung hình cao
Chọn chế độ này nếu bạn muốn tệp cuối cùng có tốc độ khung hình cao (ví dụ: video 120 khung hình/giây).
// 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())
Cách B: Tạo video chuyển động chậm sẵn sàng phát
Chọn chế độ này nếu bạn muốn video tự động phát ở chế độ chuyển động chậm trong bất kỳ trình phát video tiêu chuẩn nào.
// 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())
Cờ đơn này là chìa khoá để tạo video chuyển động chậm sẵn sàng phát. Khi setSlowMotionEnabled là true, CameraX sẽ xử lý luồng tốc độ cao và lưu luồng đó dưới dạng tệp video 30 khung hình/giây tiêu chuẩn. Tốc độ chuyển động chậm được xác định bằng tỷ lệ giữa tốc độ khung hình ghi hình và tốc độ phát tiêu chuẩn này.
Ví dụ:
- Khi quay ở tốc độ 120 khung hình/giây, video sẽ phát ở tốc độ 1/4x (120 ÷ 30 = 4).
- Khi quay ở tốc độ 240 khung hình/giây, video sẽ phát ở tốc độ 1/8 (240 ÷ 30 = 8).
Tổng hợp mọi kiến thức: Ghi hình video
Sau khi bạn định cấu hình HighSpeedVideoSessionConfig và liên kết HighSpeedVideoSessionConfig với vòng đời, bước cuối cùng là bắt đầu ghi. Quy trình chuẩn bị các lựa chọn đầu ra, bắt đầu ghi và xử lý các sự kiện video cũng giống như quy trình chuẩn bị các lựa chọn đầu ra cho hoạt động quay video tiêu chuẩn.
Bài đăng này tập trung vào cấu hình tốc độ cao, vì vậy chúng tôi sẽ không đề cập chi tiết đến quy trình ghi. Để xem hướng dẫn toàn diện về mọi thứ, từ việc chuẩn bị đối tượng FileOutputOptions hoặc MediaStoreOutputOptions cho đến việc xử lý các lệnh gọi lại VideoRecordEvent, vui lòng tham khảo tài liệu về 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 Photos hỗ trợ video chuyển động chậm
Khi bạn bật setSlowMotionEnabled(true) trong CameraX, tệp video kết quả được thiết kế để có thể nhận dạng và phát ngay ở chế độ chuyển động chậm trong các trình phát video tiêu chuẩn và ứng dụng thư viện. Đặc biệt, Google Photos cung cấp chức năng nâng cao cho những video chuyển động chậm này khi tốc độ khung hình chụp là 120, 240, 360, 480 hoặc 960 khung hình/giây:
- Nhận dạng giao diện người dùng riêng biệt trong hình thu nhỏ: Trong thư viện Google Photos, bạn có thể xác định video chuyển động chậm bằng các phần tử giao diện người dùng cụ thể, giúp phân biệt video chuyển động chậm với video thông thường.
|
|
| Hình thu nhỏ video thông thường | Hình thu nhỏ video chuyển động chậm |
- Điều chỉnh tốc độ của các đoạn trong khi phát: Khi phát một video chuyển động chậm, Google Photos cung cấp các chế độ điều khiển để điều chỉnh những phần nào của video phát ở tốc độ chậm và những phần nào phát ở tốc độ bình thường, giúp người dùng có quyền kiểm soát sáng tạo. Sau đó, bạn có thể xuất video đã chỉnh sửa dưới dạng một tệp video mới bằng nút Chia sẻ, đồng thời giữ nguyên các đoạn chuyển động chậm mà bạn đã xác định.
|
|
| Phát video theo cách thông thường | Phát video chuyển động chậm kèm các nút điều khiển chỉnh sửa |
Lưu ý về khả năng hỗ trợ thiết bị
API tốc độ cao của CameraX dựa vào hệ thống CamcorderProfile cơ bản của Android để xác định những độ phân giải và tốc độ khung hình cao mà một thiết bị hỗ trợ. Bộ kiểm tra tính tương thích (CTS) với Android sẽ xác thực CamcorderProfile, tức là bạn có thể tin tưởng vào các chức năng quay video mà thiết bị báo cáo.
Điều này có nghĩa là khả năng quay video chuyển động chậm của thiết bị bằng ứng dụng camera tích hợp không đảm bảo rằng API tốc độ cao của CameraX sẽ hoạt động. Sự khác biệt này xảy ra vì nhà sản xuất thiết bị chịu trách nhiệm điền các mục CamcorderProfile vào chương trình cơ sở của thiết bị và đôi khi các cấu hình tốc độ cao cần thiết như CamcorderProfile.QUALITY_HIGH_SPEED_1080P và CamcorderProfile.QUALITY_HIGH_SPEED_720P không được đưa vào. Khi thiếu các hồ sơ này, Recorder.getHighSpeedVideoCapabilities() sẽ trả về null.
Do đó, bạn phải luôn sử dụng Recorder.getHighSpeedVideoCapabilities() để kiểm tra các tính năng được hỗ trợ theo phương thức lập trình, vì đây là cách đáng tin cậy nhất để đảm bảo trải nghiệm nhất quán trên nhiều thiết bị. Nếu bạn cố gắng liên kết một HighSpeedVideoSessionConfig trên thiết bị mà Recorder.getHighSpeedVideoCapabilities() trả về giá trị rỗng, thì thao tác sẽ không thành công với một IllegalArgumentException. Bạn có thể xác nhận khả năng hỗ trợ trên các thiết bị Google Pixel, vì các thiết bị này luôn có những cấu hình tốc độ cao này. Ngoài ra, nhiều thiết bị của các nhà sản xuất khác, chẳng hạn như Motorola Edge 30, OPPO Find N2 Flip và Sony Xperia 1 V, cũng hỗ trợ khả năng quay video ở tốc độ cao.
Kết luận
API video tốc độ cao của CameraX vừa mạnh mẽ vừa linh hoạt. Cho dù bạn cần cảnh quay có tốc độ khung hình cao thực sự để phân tích kỹ thuật hay muốn thêm hiệu ứng chuyển động chậm điện ảnh vào ứng dụng của mình, HighSpeedVideoSessionConfig đều cung cấp một giải pháp hợp nhất và đơn giản. Bằng cách hiểu rõ vai trò của cờ setSlowMotionEnabled, bạn có thể dễ dàng hỗ trợ cả hai trường hợp sử dụng và cho phép người dùng kiểm soát mẫu quảng cáo nhiều hơn.
Tiếp tục đọc
-
Hướng dẫn
Hôm nay, chúng tôi rất vui mừng thông báo về một thông tin xác thực mới về email đã xác minh do Google phát hành. Giờ đây, nhà phát triển có thể truy xuất thông tin này trực tiếp từ API Thông tin xác thực kỹ thuật số của Trình quản lý thông tin xác thực trên Android.
Niharika Arora, Jean-Pierre Pralle • Đọc trong 3 phút
-
Hướng dẫn
Cho dù bạn đang sử dụng Gemini trong Android Studio, Gemini CLI, Antigravity hay các tác nhân của bên thứ ba như Claude Code hoặc Codex, thì sứ mệnh của chúng tôi là đảm bảo bạn có thể phát triển ứng dụng Android chất lượng cao ở mọi nơi.
Adarsh Fernando, Esteban de la Canal • Đọc trong 4 phút
-
Hướng dẫn
Nhận thấy rằng tình trạng tiêu hao pin quá mức là điều đầu tiên trong tâm trí của người dùng Android, Google đã thực hiện các bước quan trọng để giúp nhà phát triển tạo ra những ứng dụng tiết kiệm pin hơn.
Alice Yuan • Đọc trong 8 phút
Nhận thông tin cập nhật
Nhận thông tin chi tiết mới nhất về hoạt động phát triển trên Android trong hộp thư đến của bạn mỗi tuần.