Запись видео
Снимайте видео с помощью 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 — локальная установка не требуется.