Rejestrowanie szybko poruszających się obiektów z zachowaniem ostrości to kluczowa funkcja nowoczesnych aplikacji aparatu. Jest to możliwe dzięki szybkiemu rejestrowaniu, czyli procesowi rejestrowania klatek z częstotliwością 120 lub 240 klatek na sekundę. Ten tryb nagrywania o wysokiej wierności może być używany w 2 różnych celach: do tworzenia filmu o wysokiej liczbie klatek na sekundę, który umożliwia szczegółową analizę klatka po klatce, lub do generowania filmu w zwolnionym tempie, w którym akcja rozwija się na ekranie w dramatyczny sposób.
Wcześniej wdrażanie tych funkcji za pomocą interfejsu Camera2 API wymagało więcej pracy. Dzięki nowemu szybkiemu interfejsowi API w CameraX 1.5 cały proces jest uproszczony, co daje Ci możliwość tworzenia filmów o wysokiej liczbie klatek na sekundę lub gotowych do odtworzenia klipów w zwolnionym tempie. Z tego posta dowiesz się, jak opanować obie te umiejętności. Jeśli dopiero zaczynasz korzystać z CameraX, zapoznaj się z omówieniem CameraX.
Zasada działania zwolnionego tempa
Podstawową zasadą działania zwolnionego tempa jest nagrywanie filmu z dużo większą liczbą klatek na sekundę niż liczba klatek na sekundę podczas odtwarzania. Jeśli na przykład nagrasz 1-sekundowe zdarzenie przy 120 klatkach na sekundę (fps), a następnie odtworzysz je w standardowej szybkości 30 klatek na sekundę, film będzie odtwarzany przez 4 sekundy. To „rozciągnięcie” czasu tworzy efekt dramatycznego zwolnionego tempa, dzięki któremu możesz zobaczyć szczegóły, które są zbyt szybkie dla nieuzbrojonego oka.
Aby gotowy film był płynny, powinien być renderowany z szybkością co najmniej 30 kl./s. Oznacza to, że aby utworzyć film w 4-krotnym zwolnionym tempie, pierwotna liczba klatek musi wynosić co najmniej 120 kl./s (120 kl./s ÷ 4 = 30 kl./s).
Po zarejestrowaniu materiału w wysokiej liczbie klatek na sekundę można uzyskać pożądany efekt na 2 sposoby:
- Zwolnione tempo obsługiwane przez odtwarzacz (film z dużą liczbą klatek na sekundę): nagranie w dużej szybkości (np.120 kl./s) jest zapisywane bezpośrednio jako plik wideo z dużą liczbą klatek na sekundę. Wtedy odtwarzacz wideo musi zmniejszyć szybkość odtwarzania. Dzięki temu użytkownik może przełączać się między normalnym odtwarzaniem a odtwarzaniem w zwolnionym tempie.
- Gotowy do odtworzenia film w zwolnionym tempie (ponownie zakodowany film): strumień wideo o dużej szybkości jest przetwarzany i ponownie kodowany do pliku o standardowej liczbie klatek na sekundę (np.30 kl./s). Efekt zwolnionego tempa jest „wbudowany” przez dostosowanie sygnatur czasowych klatek. Wynikowy film będzie odtwarzany w zwolnionym tempie w każdym standardowym odtwarzaczu bez specjalnej obsługi. Domyślnie film jest odtwarzany w zwolnionym tempie, ale odtwarzacze wideo mogą udostępniać elementy sterujące szybkością odtwarzania, które pozwalają użytkownikowi zwiększyć szybkość i obejrzeć film w oryginalnym tempie.
Interfejs CameraX API upraszcza ten proces, ponieważ zapewnia ujednolicony sposób wyboru odpowiedniego podejścia, co zobaczysz poniżej.
Nowy interfejs High-Speed Video API
Nowe rozwiązanie CameraX składa się z 2 głównych komponentów:
-
Recorder#getHighSpeedVideoCapabilities(CameraInfo): ta metoda pozwala sprawdzić, czy aparat może nagrywać w trybie szybkiego nagrywania, a jeśli tak, to jakie rozdzielczości (obiektyQuality) są obsługiwane. -
HighSpeedVideoSessionConfig: jest to specjalny obiekt konfiguracji, który grupuje przypadki użyciaVideoCaptureiPreview, informując CameraX o konieczności utworzenia ujednoliconej sesji kamery o dużej szybkości. Pamiętaj, że strumień VideoCapture będzie działać z ustawioną wysoką liczbą klatek na sekundę, ale strumień podglądu będzie zwykle ograniczony do standardowej liczby klatek na sekundę wynoszącej co najmniej 30 kl./s przez system kamery, aby zapewnić płynne wyświetlanie na ekranie.
Pierwsze kroki
Zanim zaczniesz, upewnij się, że do pliku build.gradle.kts aplikacji zostały dodane niezbędne zależności CameraX. Będziesz potrzebować artefaktu camera-video wraz z podstawowymi bibliotekami 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")
}
Uwaga na temat eksperymentalnych interfejsów API
Warto pamiętać, że interfejsy API do nagrywania z dużą szybkością są obecnie w fazie eksperymentalnej. Oznacza to, że w przyszłych wersjach mogą ulec zmianie. Aby z nich korzystać, musisz wyrazić na to zgodę, dodając do kodu tę adnotację:
@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)
Implementacja
Wdrożenie w obu przypadkach zaczyna się od tych samych kroków konfiguracji. Wybór między utworzeniem filmu o wysokiej liczbie klatek na sekundę a filmu w zwolnionym tempie sprowadza się do jednego ustawienia.
1. Konfigurowanie rejestrowania dużej liczby klatek na sekundę
Najpierw, niezależnie od celu, musisz uzyskać ProcessCameraProvider, sprawdzić możliwości urządzenia i utworzyć przypadki użycia.
Poniższy blok kodu pokazuje pełny proces konfiguracji w funkcji zawieszania. Możesz wywołać tę funkcję z zakresu współprogramu, np. 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. Wybieranie danych wyjściowych
Teraz zdecyduj, jaki rodzaj filmu chcesz utworzyć. Ten kod będzie działać w funkcji setupCamera() suspend pokazanej powyżej.
Opcja A. Tworzenie filmu o wysokiej liczbie klatek na sekundę
Wybierz tę opcję, jeśli chcesz, aby plik końcowy miał wysoką liczbę klatek na sekundę (np. 120 klatek na sekundę).
// 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())
Opcja B: tworzenie gotowego do odtworzenia filmu w zwolnionym tempie
Wybierz tę opcję, jeśli chcesz, aby film odtwarzany w zwolnionym tempie był automatycznie odtwarzany w dowolnym standardowym odtwarzaczu wideo.
// 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())
Ten pojedynczy znacznik jest kluczem do utworzenia gotowego do odtworzenia filmu w zwolnionym tempie. Gdy warunek setSlowMotionEnabled jest spełniony, CameraX przetwarza strumień o dużej szybkości i zapisuje go jako standardowy plik wideo 30 kl./s. Szybkość odtwarzania w zwolnionym tempie jest określana przez stosunek liczby klatek na sekundę podczas nagrywania do standardowej szybkości odtwarzania.
Na przykład:
- Nagrywanie z częstotliwością 120 kl./s spowoduje, że film będzie odtwarzany z 4-krotnie mniejszą szybkością (120 ÷ 30 = 4).
- Nagrywanie z częstotliwością 240 kl./s spowoduje utworzenie filmu, który będzie odtwarzany z 8-krotnie mniejszą szybkością (240 ÷ 30 = 8).
Łączenie wszystkiego w całość: nagrywanie filmu
Po skonfigurowaniu HighSpeedVideoSessionConfig i powiązaniu go z cyklem życia ostatnim krokiem jest rozpoczęcie nagrywania. Proces przygotowywania opcji wyjściowych, rozpoczynania nagrywania i obsługi zdarzeń wideo jest taki sam jak w przypadku standardowego nagrywania wideo.
Ten post skupia się na konfiguracji szybkiego nagrywania, więc nie będziemy szczegółowo omawiać procesu nagrywania. Szczegółowe informacje na temat przygotowywania obiektu FileOutputOptions lub MediaStoreOutputOptions oraz obsługi wywołań zwrotnych VideoRecordEvent znajdziesz w dokumentacji 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)
}
Obsługa filmów w zwolnionym tempie w Zdjęciach Google
Gdy włączysz setSlowMotionEnabled(true) w CameraX, wynikowy plik wideo będzie od razu rozpoznawalny i odtwarzalny jako film w zwolnionym tempie w standardowych odtwarzaczach wideo i aplikacjach galerii. Zdjęcia Google oferują rozszerzone funkcje w przypadku filmów w zwolnionym tempie, gdy liczba klatek na sekundę wynosi 120, 240, 360, 480 lub 960:
- Rozpoznawanie charakterystycznego interfejsu w miniaturze: w bibliotece Zdjęć Google filmy w zwolnionym tempie można rozpoznać po charakterystycznych elementach interfejsu, które odróżniają je od zwykłych filmów.
- Dostosowywanie szybkości odtwarzania podczas odtwarzania: podczas odtwarzania filmu w zwolnionym tempie Zdjęcia Google udostępniają elementy sterujące, które pozwalają dostosować, które części filmu mają być odtwarzane w zwolnionym tempie, a które w normalnym tempie, co daje użytkownikom większą kontrolę nad kreatywnością. Edytowany film można następnie wyeksportować jako nowy plik wideo za pomocą przycisku Udostępnij, zachowując zdefiniowane segmenty w zwolnionym tempie.
Uwaga na temat obsługi urządzeń
Interfejs API CameraX o dużej szybkości opiera się na systemie Android CamcorderProfile, który określa, jakie rozdzielczości i liczby klatek na sekundę o dużej szybkości są obsługiwane przez urządzenie. Profile kamery są weryfikowane przez pakiet testów zgodności Androida (CTS), co oznacza, że możesz mieć pewność, że zgłaszane możliwości nagrywania wideo na urządzeniu są prawidłowe.
Oznacza to, że możliwość nagrywania filmów w zwolnionym tempie za pomocą wbudowanej aplikacji aparatu nie gwarantuje, że interfejs CameraX o dużej szybkości będzie działać. Ta rozbieżność wynika z tego, że producenci urządzeń są odpowiedzialni za wypełnianie wpisów CamcorderProfile w oprogramowaniu urządzenia, a czasami nie uwzględniają niezbędnych profili o dużej szybkości, takich jak CamcorderProfile.QUALITY_HIGH_SPEED_1080P i CamcorderProfile.QUALITY_HIGH_SPEED_720P. Gdy tych profili brakuje, Recorder.getHighSpeedVideoCapabilities() zwraca null.
Dlatego zawsze używaj Recorder.getHighSpeedVideoCapabilities(), aby programowo sprawdzać obsługiwane funkcje. Jest to najbardziej niezawodny sposób na zapewnienie spójnych wrażeń na różnych urządzeniach. Jeśli spróbujesz powiązać HighSpeedVideoSessionConfig na urządzeniu, na którym Recorder.getHighSpeedVideoCapabilities() zwraca wartość null, operacja się nie powiedzie i zostanie zwrócony błąd IllegalArgumentException. Możesz sprawdzić, czy Twoje urządzenie Google Pixel obsługuje te profile, ponieważ są one w nich zawsze dostępne. Funkcje nagrywania filmów w wysokiej rozdzielczości są też dostępne na różnych urządzeniach innych producentów, takich jak Motorola Edge 30, OPPO Find N2 Flip i Sony Xperia 1 V.
Podsumowanie
Interfejs CameraX do nagrywania filmów z dużą szybkością jest zarówno zaawansowany, jak i elastyczny. Niezależnie od tego, czy potrzebujesz nagrań o wysokiej liczbie klatek na sekundę do analizy technicznej, czy chcesz dodać do aplikacji filmowe efekty zwolnionego tempa, HighSpeedVideoSessionConfig zapewnia ujednolicone i proste rozwiązanie. Znając rolę flagi setSlowMotionEnabled, możesz łatwo obsługiwać oba przypadki użycia i zapewnić użytkownikom większą kontrolę twórczą.
Czytaj dalej
-
Instrukcje
Niezależnie od tego, czy używasz Gemini w Android Studio, interfejsu wiersza poleceń Gemini, Antigravity czy agentów innych firm, takich jak Claude Code lub Codex, naszym celem jest zapewnienie możliwości tworzenia wysokiej jakości aplikacji na Androida w każdym miejscu.
Adarsh Fernando, Esteban de la Canal • Czas czytania: 4 minuty
-
Instrukcje
Zdając sobie sprawę, że szybkie zużycie baterii jest dla użytkowników Androida natychmiastowym skojarzeniem, Google podejmuje znaczące kroki, aby pomóc deweloperom w tworzeniu aplikacji bardziej energooszczędnych.
Alice Yuan • Czas czytania: 8 minut
-
Instrukcje
Chcieliśmy przedstawić Ci przykłady funkcji opartych na AI, które korzystają z modeli na urządzeniu i w chmurze, oraz zainspirować Cię do tworzenia atrakcyjnych rozwiązań dla użytkowników.
Thomas Ezan, Ivy Knight • Czas czytania: 2 minuty
Bądź na bieżąco
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.