0Pricing
Android Academy · Урок

Запись видео

Снимайте видео с помощью CameraX

«Запись видео» — бесплатный урок Android Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.

Запись видео с помощью CameraX

CameRX записывает видео через вариант использования VideoCapture, работающий на основе Recorder. На этом уроке вы настроите захват видео, запустите и остановите запись и сохраните её в галерею, включая звуковую дорожку.

Процесс похож на работу с фотографиями, но дополнительно включает длительный сеанс Recording, который сначала запускается, а затем останавливается.

Recorder и качество

Сначала создайте Recorder, который определяет кодирование и качество. С помощью QualitySelector можно запросить нужное качество (например, HD или FHD) с запасным вариантом, если устройство не может его обеспечить.

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

Создание VideoCapture

Оберните Recorder в вариант использования VideoCapture с помощью фабрики withOutput. Именно этот объект вы связываете с камерой, так же как и ImageCapture.

val videoCapture = VideoCapture.withOutput(recorder)

Связывание предварительного просмотра и VideoCapture

Свяжите предварительный просмотр и VideoCapture. Обратите внимание: на многих устройствах нельзя одновременно связать ImageCapture и VideoCapture, поэтому выбирайте варианты использования, необходимые вашему экрану.

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

Разрешение на доступ к микрофону

Для записи звука помимо CAMERA требуется разрешение времени выполнения RECORD_AUDIO. Запросите оба разрешения до начала записи и включайте звук только в том случае, если пользователь его предоставил.

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

Вывод через MediaStore

Как и фотографии, сохраняйте видео в MediaStore, используя изолированное хранилище. Создайте ContentValues с MIME-типом mp4 и создайте 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()

Запуск записи

Подготовьте запись с помощью рекордера, при необходимости включите звук через withAudioEnabled(), а затем вызовите start(). start() возвращает объект Recording, который нужно сохранить, чтобы позднее остановить запись.

Также передайте слушатель, получающий обновления 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
                }
            }
        }
    }

Обработка событий записи

Слушатель сообщает о жизненном цикле записи:

  • VideoRecordEvent.Start — запись началась (обновите интерфейс, заменив кнопку на кнопку остановки).
  • VideoRecordEvent.Status — периодические обновления длительности и размера записанного материала.
  • VideoRecordEvent.Finalize — запись завершена; проверьте hasError().
is VideoRecordEvent.Status -> {
    val seconds = event.recordingStats.recordedDurationNanos / 1_000_000_000
    // Update an on-screen timer.
}

Остановка записи

Чтобы завершить запись, вызовите stop() у сохранённого ранее объекта Recording. Это вызовет событие Finalize, после которого URI видео станет доступен.

Храните активную запись в состоянии, чтобы одна кнопка могла переключаться между запуском и остановкой.

var activeRecording: Recording? = null

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

Пауза и продолжение

Объект Recording также можно приостановить и возобновить без остановки. Это удобно, если нужно позволить пользователям объединить фрагменты в один файл.

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

Интерфейс Compose для записи

Управляйте интерфейсом через состояние. Отслеживайте, активна ли запись, и соответственно меняйте значок и действие кнопки. Поскольку слушатель выполняется в главном исполнителе, вы можете напрямую обновлять состояние 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"
    )
}

Быстрая проверка

Проверьте, насколько хорошо вы разобрались в записи видео с помощью CameraX.

Итоги

Теперь вы умеете записывать видео с помощью CameraX:

  • Создайте Recorder с помощью QualitySelector и оберните его в VideoCapture.withOutput.
  • Свяжите его с предварительным просмотром и запросите RECORD_AUDIO для записи звука.
  • Сохраните видео через MediaStoreOutputOptions, затем вызовите prepareRecording().start(), чтобы получить Recording.
  • Обрабатывайте события VideoRecordEvent; вызовите stop(), чтобы завершить запись, и прочитайте URI сохранённого файла.

Вы завершили курс по CameraX — в вашем арсенале теперь есть предварительный просмотр, фотосъёмка и видеозапись.

Часто задаваемые вопросы

Урок «Запись видео» бесплатный?

Да — полный текст урока «Запись видео» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.

Чему я научусь в уроке «Запись видео»?

Снимайте видео с помощью CameraX Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Запись видео»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Обзор CameraX
  2. Отображение предварительного просмотра с камеры
  3. Съёмка фотографий
  4. Запись видео
← Назад к Android Academy