Android Academy · Lektion

Spela in video

Fånga video med CameraX.

Lektion 4 av 413 steg

Spela in video är en gratis lektion i Android Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Android Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Android Academy innehåller totalt 4 lektioner.

Spela in video med CameraX

CameRX spelar in video genom användningsfallet VideoCapture, som använder en Recorder i bakgrunden. I den här lektionen konfigurerar Ni videoinspelning, startar och stoppar en inspelning och sparar den i galleriet — inklusive ljud.

Flödet liknar det för foton, men innehåller dessutom en långvarig Recording-session som Ni startar och senare stoppar.

Recorder och kvalitet

Först skapar Ni en Recorder, som definierar kodning och kvalitet. Med QualitySelector kan Ni begära en målkvalitet, till exempel HD eller FHD, med en reservlösning om enheten inte kan tillhandahålla den.

val recorder = Recorder.Builder()
    .setQualitySelector(
        QualitySelector.from(
            Quality.FHD,
            FallbackStrategy.lowerQualityOrHigherThan(Quality.SD)
        )
    )
    .build()

Skapa VideoCapture

Omslut Recorder i ett användningsfall för VideoCapture med fabriken withOutput. Det här är objektet som Ni binder till kameran, precis som ImageCapture.

val videoCapture = VideoCapture.withOutput(recorder)

Binda förhandsvisning + VideoCapture

Bind förhandsvisningen och VideoCapture tillsammans. Observera att Ni på många enheter inte kan binda ImageCapture och VideoCapture samtidigt, så välj de användningsfall som skärmen behöver.

cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
    lifecycleOwner,
    CameraSelector.DEFAULT_BACK_CAMERA,
    preview,
    videoCapture
)

Ljudbehörighet

För att spela in ljud behöver Ni körningsbehörigheten RECORD_AUDIO utöver CAMERA. Begär båda innan inspelningen startar och aktivera endast ljud om användaren har beviljat behörigheten.

// 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

Utdata via MediaStore

Precis som för foton sparar Ni videon i MediaStore med begränsad lagring. Skapa ContentValues med MIME-typen mp4 och skapa 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()

Starta en inspelning

Förbered inspelningen från inspelaren, aktivera valfritt ljud med withAudioEnabled() och anropa sedan start(). start() returnerar ett Recording-objekt som Ni sparar så att Ni kan stoppa inspelningen senare.

Ni skickar också med en lyssnare som tar emot uppdateringar av typen 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
                }
            }
        }
    }

Reagera på inspelningshändelser

Lyssnaren skickar inspelningens livscykel:

  • VideoRecordEvent.Start — inspelningen har börjat (uppdatera gränssnittet till en stoppknapp).
  • VideoRecordEvent.Status — återkommande uppdateringar med inspelningens längd och storlek.
  • VideoRecordEvent.Finalize — inspelningen har avslutats; kontrollera hasError().
is VideoRecordEvent.Status -> {
    val seconds = event.recordingStats.recordedDurationNanos / 1_000_000_000
    // Update an on-screen timer.
}

Stoppa inspelningen

Anropa stop() på den Recording som Ni sparade tidigare för att avsluta. Det utlöser händelsen Finalize, där videons URI blir tillgänglig.

Håll den aktiva inspelningen i state så att en enda knapp kan växla mellan att starta och stoppa.

var activeRecording: Recording? = null

// Toggle handler:
if (activeRecording == null) {
    activeRecording = startRecording()
} else {
    activeRecording?.stop()
    activeRecording = null
}

Pausa och återuppta

En Recording kan också pausas och återupptas utan att stoppas. Det är praktiskt när användare ska kunna sammanfoga klipp till en enda fil.

activeRecording?.pause()
// ...later
activeRecording?.resume()
// Final stop writes the file:
activeRecording?.stop()

Compose-gränssnitt för inspelning

Styr gränssnittet från state. Håll reda på om en inspelning är aktiv och byt knappens ikon och åtgärd därefter. Eftersom lyssnaren körs på huvudexekveraren kan Ni uppdatera Compose-state direkt från den.

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"
    )
}

Snabbkontroll

Bekräfta att Ni förstår videoinspelning med CameraX.

Sammanfattning

Nu kan Ni spela in video med CameraX:

  • Skapa en Recorder med en QualitySelector och omslut den i VideoCapture.withOutput.
  • Bind den med förhandsvisningen och begär RECORD_AUDIO för ljud.
  • Spara via MediaStoreOutputOptions och anropa sedan prepareRecording().start() för att få ett Recording-objekt.
  • Reagera på VideoRecordEvent; anropa stop() för att slutföra inspelningen och läs den sparade URI:n.

Ni har slutfört CameraX-kursen — förhandsvisning, foton och video finns nu i Er verktygslåda.

Gratis att börja

Lär dig Kotlin med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
36
Lektioner
152

Vanliga frågor

Är lektionen ”Spela in video” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Android Academy, inklusive ”Spela in video”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Android Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Spela in video”?

Fånga video med CameraX. Ni övar på Android Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Android Academy?

Du behöver inga förkunskaper. Utbildningen i Android Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Spela in video”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Android Academy-lektionen?

Ja. Varje Android Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Översikt över CameraX
  2. Visa en kameraförhandsvisning
  3. Ta foton
  4. Spela in video
← Tillbaka till Android Academy