美文网首页
Android CameraX 详解五(视频拍摄录制)

Android CameraX 详解五(视频拍摄录制)

作者: Kael_Zhang的安卓笔记 | 来源:发表于2022-08-24 09:05 被阅读0次

机票直达

Android CameraX 详解一 (引言&基础)
Android CameraX 详解二 (实时预览)
Android CameraX 详解三 (拍照)
Android CameraX 详解四 (图片分析)
Android CameraX 详解五(视频拍摄录制)

概述

视频拍摄通常会录制视频流和音频流,对其进行压缩,对这两个流进行多路复用,然后将生成的流写入磁盘,如图1所示

图1
在 CameraX 中,用于视频捕获的解决方案是 VideoCapture对象,如图2所示视频捕获包括几个高级架构组件:
  • SurfaceProvider,表示视频来源。
  • AudioSource,表示音频来源。
  • 用于对视频/音频进行编码和压缩的两个编码器
  • 用于对两个流进行多路复用的媒体复用器
  • 用于保存结果的文件保存器


    图2

录制视频所用到的对象

  • VideoCapture是顶级用例类。VideoCapture 通过 CameraSelector 和其他 CameraX 用例绑定到 LifecycleOwner
  • Recorder是与 VideoCapture 紧密耦合的 VideoOutput 实现。 Recorder 用于执行视频和音频捕获操作。应用通过 Recorder 创建录制对象。
  • PendingRecording会配置录制对象,同时提供启用音频和设置事件监听器等选项。您必须使用 Recorder 来创建 PendingRecordingPendingRecording 不会录制任何内容。
  • Recording会执行实际录制操作。您必须使用 PendingRecording 来创建 Recording
  • 图3所示它们之间的关系


    图3

录制步骤

  • 申请 REORD_AUDIO CAMERA权限、添加PreviewView到布局(参考实时预览章节中添加布局
  • 创建 QualitySelector(分辨率选择器)
    Quality.UHD,适用于 4K 超高清视频大小 (2160p)
    Quality.FHD,适用于全高清视频大小 (1080p)
    Quality.HD,适用于高清视频大小 (720p)
    Quality.SD,适用于标清视频大小 (480p)
    创建QualitySelector方法1:设置首选分辨率和备选分辨率,首选分辨率全部不支持时备选分辨率启用
    创建QualitySelector方法2:获取设备支持的分辨率列表,然后选择其一创建QualitySelector
//方法1
val qualitySelector = QualitySelector.fromOrderedList(
         listOf(Quality.UHD, Quality.FHD, Quality.HD, Quality.SD),
         FallbackStrategy.lowerQualityOrHigherThan(Quality.SD))
//方法2
val cameraInfo = cameraProvider.availableCameraInfos.filter {
    Camera2CameraInfo
    .from(it)
    .getCameraCharacteristic(CameraCharacteristics.LENS\_FACING) == CameraMetadata.LENS_FACING_BACK
}

val supportedQualities = QualitySelector.getSupportedQualities(cameraInfo[0])
val filteredQualities = arrayListOf (Quality.UHD, Quality.FHD, Quality.HD, Quality.SD)
                       .filter { supportedQualities.contains(it) }
val qualitySelector = QualitySelector.from(filteredQualities[position])  //position为选择项
  • 创建 Recorder
val recorder = Recorder.Builder()
    .setExecutor(cameraExecutor).setQualitySelector(qualitySelector)
    .build()
  • 创建VideoCapture 并绑定
val videoCapture = VideoCapture.withOutput(recorder)

val preview = Preview.Builder().build()
val viewFinder: PreviewView = findViewById(R.id.previewView)
preview.setSurfaceProvider(viewFinder.getSurfaceProvider())

try {
    // Bind use cases to camera
    cameraProvider.bindToLifecycle(
            this, CameraSelector.DEFAULT_BACK_CAMERA, preview, videoCapture)
} catch(exc: Exception) {
    Log.e(TAG, "Use case binding failed", exc)
}
  • 设置保存参数
val name = "CameraX-recording.mp4"
val contentValues = ContentValues().apply {
   put(MediaStore.Video.Media.DISPLAY_NAME, name)
}
val mediaStoreOutput = MediaStoreOutputOptions.Builder(this.contentResolver,
                              MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
                              .setContentValues(contentValues)
                              .build()
  • 开始录制
    使用 Recorder.prepareRecording 方法为 Recorder 配置 OutputOptions,该方法返回PendingRecording 对象
    使用 PendingRecording.withAudioEnabled 方法启用音频
    使用 PendingRecording.start 方法开始录制并返回 Recording 对象
val recording = videoCapture.output
                .prepareRecording(context, mediaStoreOutput)
                .withAudioEnabled()
                .start(ContextCompat.getMainExecutor(this), captureListener)

录制控制

  • 如果需要,使用 withAudioEnabled() 启用音频
  • 针对 Recording使用 pause()/resume()/stop() 来控制录制操作
  • 在事件监听器内响应 VideoRecordEvents,即 开始录制示例代码中的captureListener

存储配置

Recorder 支持以下类型的 OutputOptions

  • FileDescriptorOutputOptions,用于捕获到 FileDescriptor
  • FileOutputOptions,用于捕获到 File
  • MediaStoreOutputOptions,用于捕获到 MediaStore

相关文章

网友评论

      本文标题:Android CameraX 详解五(视频拍摄录制)

      本文链接:https://www.haomeiwen.com/subject/dibigrtx.html