Android Academy · Lekcja

Nagrywanie wideo

Nagrywaj wideo za pomocą CameraX

Lekcja 4 z 413 kroki

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_GRANTED

Dane 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 Recorder z użyciem QualitySelector i umieść go w VideoCapture.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łuj prepareRecording().start(), aby otrzymać obiekt Recording.
  • Reaguj na zdarzenia VideoRecordEvent; wywołaj stop(), 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.

Bezpłatny start

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

  1. Przegląd CameraX
  2. Wyświetlanie podglądu z aparatu
  3. Robienie zdjęć
  4. Nagrywanie wideo
← Powrót do Android Academy