Nagrywanie wideo
Nagrywaj wideo za pomocą CameraX
Nagrywanie wideo to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 4 lekcji w sumie.
Nagrywanie filmu za pomocą CameraX
CameRX nagrywa filmy za pośrednictwem przypadku użycia VideoCapture, opartego na obiekcie Recorder. W tej lekcji skonfigurujesz przechwytywanie obrazu wideo, rozpoczniesz i zatrzymasz nagrywanie oraz zapiszesz film w galerii — razem z dźwiękiem.
Przebieg przypomina robienie zdjęć, ale obejmuje dodatkowo długotrwałą sesję Recording, którą najpierw uruchamiasz, a później zatrzymujesz.
Recorder i jakość
Najpierw tworzysz obiekt Recorder, który określa kodowanie i jakość. QualitySelector pozwala zażądać docelowej jakości (np. HD lub FHD) wraz z wartością zastępczą na wypadek, gdyby urządzenie nie mogło jej zapewnić.
val recorder = Recorder.Builder()
.setQualitySelector(
QualitySelector.from(
Quality.FHD,
FallbackStrategy.lowerQualityOrHigherThan(Quality.SD)
)
)
.build()Tworzenie VideoCapture
Umieść Recorder w przypadku użycia VideoCapture, korzystając z fabryki withOutput. Jest to obiekt, który powiążesz z aparatem, podobnie jak ImageCapture.
val videoCapture = VideoCapture.withOutput(recorder)Powiązanie Preview + VideoCapture
Powiąż podgląd z VideoCapture. Pamiętaj, że na wielu urządzeniach nie można jednocześnie powiązać ImageCapture i VideoCapture, dlatego wybierz przypadki użycia potrzebne na danym ekranie.
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
lifecycleOwner,
CameraSelector.DEFAULT_BACK_CAMERA,
preview,
videoCapture
)Uprawnienie do nagrywania dźwięku
Do nagrywania dźwięku potrzebne jest uprawnienie czasu działania RECORD_AUDIO, oprócz CAMERA. Poproś o oba uprawnienia przed rozpoczęciem nagrywania i włączaj dźwięk tylko wtedy, gdy użytkownik go udzielił.
// Manifest declares both:
// <uses-permission android:name="android.permission.CAMERA" />
// <uses-permission android:name="android.permission.RECORD_AUDIO" />
val audioGranted = ContextCompat.checkSelfPermission(
context, Manifest.permission.RECORD_AUDIO
) == PackageManager.PERMISSION_GRANTEDDane wyjściowe przez MediaStore
Podobnie jak zdjęcia, film należy zapisać w MediaStore z użyciem magazynu zakresowego. Utwórz ContentValues z typem MIME mp4, a następnie utwórz MediaStoreOutputOptions.
val values = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, "VID_${System.currentTimeMillis()}")
put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/MyApp")
}
val outputOptions = MediaStoreOutputOptions
.Builder(context.contentResolver, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
.setContentValues(values)
.build()Rozpoczynanie nagrywania
Przygotuj nagrywanie za pomocą obiektu recorder, opcjonalnie włącz dźwięk przez withAudioEnabled(), a następnie wywołaj start(). start() zwraca obiekt Recording, który należy zachować, aby móc później zatrzymać nagrywanie.
Należy także przekazać listener, który odbiera aktualizacje VideoRecordEvent.
val recording = videoCapture.output
.prepareRecording(context, outputOptions)
.apply { if (audioGranted) withAudioEnabled() }
.start(ContextCompat.getMainExecutor(context)) { event ->
when (event) {
is VideoRecordEvent.Start -> { /* recording began */ }
is VideoRecordEvent.Finalize -> {
if (!event.hasError()) {
// event.outputResults.outputUri -> saved video
}
}
}
}Reagowanie na zdarzenia nagrywania
Listener przekazuje kolejne etapy cyklu życia nagrywania:
VideoRecordEvent.Start— nagrywanie się rozpoczęło (zaktualizuj interfejs, zmieniając przycisk na przycisk zatrzymywania).VideoRecordEvent.Status— okresowe informacje o czasie trwania i rozmiarze nagrania.VideoRecordEvent.Finalize— nagrywanie się zakończyło; sprawdźhasError().
is VideoRecordEvent.Status -> {
val seconds = event.recordingStats.recordedDurationNanos / 1_000_000_000
// Update an on-screen timer.
}Zatrzymywanie nagrywania
Aby zakończyć nagrywanie, wywołaj stop() na zapisanym wcześniej obiekcie Recording. Spowoduje to wyemitowanie zdarzenia Finalize, w którym URI filmu będzie już dostępne.
Przechowuj aktywne nagranie w stanie, aby jeden przycisk mógł przełączać rozpoczęcie i zatrzymanie nagrywania.
var activeRecording: Recording? = null
// Toggle handler:
if (activeRecording == null) {
activeRecording = startRecording()
} else {
activeRecording?.stop()
activeRecording = null
}Wstrzymywanie i wznawianie
Obiekt Recording można także wstrzymać i wznowić bez zatrzymywania nagrywania. Jest to przydatne, gdy użytkownik ma łączyć klipy w jeden plik.
activeRecording?.pause()
// ...later
activeRecording?.resume()
// Final stop writes the file:
activeRecording?.stop()Interfejs Compose do nagrywania
Steruj interfejsem za pomocą stanu. Śledź, czy nagrywanie jest aktywne, i odpowiednio zmieniaj ikonę oraz działanie przycisku. Ponieważ listener działa na głównym executorze, możesz bezpośrednio aktualizować stan Compose.
var isRecording by remember { mutableStateOf(false) }
IconButton(onClick = { toggleRecording() }) {
Icon(
imageVector = if (isRecording) Icons.Default.Stop else Icons.Default.Videocam,
contentDescription = if (isRecording) "Stop" else "Record"
)
}Szybkie sprawdzenie
Upewnij się, że rozumiesz nagrywanie filmów za pomocą CameraX.
Podsumowanie
Potrafisz już nagrywać filmy za pomocą CameraX:
- Utwórz obiekt
Recorderz użyciemQualitySelectori umieść go wVideoCapture.withOutput. - Powiąż go z podglądem i poproś o
RECORD_AUDIO, aby nagrywać dźwięk. - Zapisuj nagrania za pomocą
MediaStoreOutputOptions, a następnie wywołujprepareRecording().start(), aby otrzymać obiektRecording. - Reaguj na zdarzenia
VideoRecordEvent; wywołajstop(), aby zakończyć nagrywanie, i odczytaj URI zapisanego pliku.
Ukończono kurs CameraX — podgląd, zdjęcia i filmy są już w Twoim zestawie narzędzi.
Ucz się Kotlin dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 36
- Lekcje
- 152
Często zadawane pytania
Czy lekcja „Nagrywanie wideo” jest bezpłatna?
Tak — pełny tekst „Nagrywanie wideo” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Nagrywanie wideo”?
Nagrywaj wideo za pomocą CameraX Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Android Academy?
Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Nagrywanie wideo”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?
Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Przegląd CameraX
- Wyświetlanie podglądu z aparatu
- Robienie zdjęć
- Nagrywanie wideo