Android Academy · Oppitunti

Videon tallentaminen

Tallentakaa videota CameraX:llä.

Oppitunti 4/413 vaihetta

Videon tallentaminen on ilmainen Android Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Android Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Android Academy-kurssilla on yhteensä 4 oppituntia.

Videon tallentaminen CameraX:llä

CameRX tallentaa videota VideoCapture-käyttötapauksen avulla, jonka taustalla toimii Recorder. Tässä oppitunnissa määritätte videokuvauksen, aloitatte ja lopetatte tallennuksen sekä tallennatte videon galleriaan myös äänen kanssa.

Työnkulku vastaa valokuvien ottamista, mutta siinä on lisäksi pitkäkestoinen Recording-tallennusistunto, jonka käynnistätte ja pysäytätte myöhemmin.

Recorder ja laatu

Ensin luotte Recorder-olion, joka määrittää koodauksen ja laadun. QualitySelector-luokan avulla voitte pyytää tiettyä tavoitelaatua (esimerkiksi HD- tai FHD-laatua) ja määrittää varavaihtoehdon, jos laite ei pysty tarjoamaan sitä.

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

VideoCapture-käyttötapauksen luominen

Uudelleenohjaa Recorder VideoCapture-käyttötapaukseksi withOutput-tehdasfunktion avulla. Tämä on kameraan sidottava olio, aivan kuten ImageCapture.

val videoCapture = VideoCapture.withOutput(recorder)

Esikatselun ja VideoCapturen sitominen

Sido esikatselu ja VideoCapture yhteen. Huomaa, että monissa laitteissa ImageCapture- ja VideoCapture-käyttötapauksia ei voi sitoa samanaikaisesti, joten valitse näytön tarvitsemat käyttötapaukset.

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

Äänityslupa

Äänen tallentamista varten tarvitsette RECORD_AUDIO-ajonaikaisen luvan CAMERA-luvan lisäksi. Pyytäkää molempia ennen tallennuksen aloittamista ja ottakaa ääni käyttöön vain, jos käyttäjä on myöntänyt luvan.

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

Tuloksen tallentaminen MediaStoren avulla

Kuten valokuvien tapauksessa, tallentakaa video MediaStore-palveluun rajoitetun tallennustilan käytön mukaisesti. Muodostakaa ContentValues-arvot käyttämällä mp4-MIME-tyyppiä ja luokaa 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()

Tallennuksen aloittaminen

Valmistelkaa tallennus Recorderista, ottakaa ääni halutessanne käyttöön withAudioEnabled()-funktiolla ja käynnistäkää tallennus sitten kutsumalla start()-funktiota. start() palauttaa Recording-olion, jonka säilytätte, jotta voitte pysäyttää tallennuksen myöhemmin.

Välittäkää lisäksi kuuntelija, joka vastaanottaa VideoRecordEvent-päivityksiä.

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

Tallennustapahtumiin reagoiminen

Kuuntelija välittää tallennuksen elinkaaren tapahtumat:

  • VideoRecordEvent.Start — tallennus on alkanut (päivitä käyttöliittymän painikkeeksi pysäytyspainike).
  • VideoRecordEvent.Status — säännöllisiä päivityksiä tallennuksen kestosta ja koosta.
  • VideoRecordEvent.Finalize — tallennus on päättynyt; tarkista hasError().
is VideoRecordEvent.Status -> {
    val seconds = event.recordingStats.recordedDurationNanos / 1_000_000_000
    // Update an on-screen timer.
}

Tallennuksen pysäyttäminen

Kun haluatte lopettaa tallennuksen, kutsukaa aiemmin tallennetun Recording-olion stop()-funktiota. Tämä käynnistää Finalize-tapahtuman, jossa videon URI tulee saataville.

Säilyttäkää aktiivinen tallennus tilassa, jotta yksi painike voi vaihtaa käynnistämisen ja pysäyttämisen välillä.

var activeRecording: Recording? = null

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

Keskeyttäminen ja jatkaminen

Recording-tallennuksen voi myös keskeyttää ja jatkaa ilman sen pysäyttämistä. Tämä on hyödyllistä, kun käyttäjien halutaan yhdistävän useita leikkeitä yhdeksi tiedostoksi.

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

Composen käyttöliittymä tallennusta varten

Ohjaa käyttöliittymää tilan perusteella. Seuraa, onko tallennus aktiivinen, ja vaihda painikkeen kuvaketta ja toimintoa sen mukaan. Koska kuuntelija suoritetaan pääsuorittimessa, voitte päivittää Compose-tilaa suoraan kuuntelijasta.

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

Pikatarkistus

Varmista, että hallitset videon tallentamisen CameraX:llä.

Kertaus

Osaat nyt tallentaa videota CameraX:llä:

  • Luo Recorder ja QualitySelector ja kääri se VideoCapture.withOutput-käyttötapaukseksi.
  • Sido se esikatseluun ja pyydä ääntä varten RECORD_AUDIO-lupa.
  • Tallenna MediaStoreOutputOptions-asetusten avulla ja kutsu sitten prepareRecording().start() saadaksesi Recording-olion.
  • Reagoi VideoRecordEvent-tapahtumiin, viimeistele tallennus kutsumalla stop()-funktiota ja lue tallennetun videon URI.

Olet suorittanut CameraX-kurssin — työkalupakissasi ovat nyt esikatselu, valokuvat ja video.

Aloita maksutta

Opi Kotlin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
36
Oppitunnit
152

Usein kysytyt kysymykset

Onko oppitunti ”Videon tallentaminen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Android Academy-oppimispolun 3 oppituntia, myös oppitunnin “Videon tallentaminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Android Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Videon tallentaminen”?

Tallentakaa videota CameraX:llä. Harjoittelet Android Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Android Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Android Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Videon tallentaminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Android Academy-oppitunnilla?

Kyllä. Jokainen Android Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. CameraX:n yleiskatsaus
  2. Kameran esikatselun näyttäminen
  3. Valokuvien ottaminen
  4. Videon tallentaminen
← Takaisin: Android Academy