跳转至

第18章 音视频开发

音视频开发图

学习目标:掌握Android音视频开发,理解MediaPlayer、ExoPlayer、Camera2 API等技术。

预计学习时间:5-7天 实践时间:2-3天


目录

  1. 音频播放
  2. 视频播放
  3. 音频录制
  4. 视频录制
  5. 实践练习

1. 音频播放

1.1 MediaPlayer

Kotlin
val mediaPlayer = MediaPlayer().apply {
    setDataSource(audioUrl)
    prepare()
    start()
}

// 释放资源
mediaPlayer.release()

1.2 ExoPlayer(推荐)

Kotlin
val player = ExoPlayer.Builder(context).build()
val mediaItem = MediaItem.fromUri(videoUrl)
player.setMediaItem(mediaItem)
player.prepare()
player.play()

2. 视频播放

2.1 VideoView

Kotlin
<VideoView
    android:id="@+id/videoView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

videoView.setVideoURI(videoUri)
videoView.start()

2.2 SurfaceView + MediaPlayer

Kotlin
class VideoSurfaceView(context: Context) : SurfaceView(context), SurfaceHolder.Callback {
    private val mediaPlayer = MediaPlayer()

    init {
        holder.addCallback(this)
    }

    override fun surfaceCreated(holder: SurfaceHolder) {
        mediaPlayer.setDisplay(holder)
        mediaPlayer.setDataSource(videoPath)
        mediaPlayer.prepare()
        mediaPlayer.start()
    }
}

3. 音频录制

Kotlin
// 注意:无参 MediaRecorder() 在 API 31+ 已弃用,需传入 Context
val mediaRecorder = MediaRecorder(context).apply {
    setAudioSource(MediaRecorder.AudioSource.MIC)
    setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
    setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
    setOutputFile(outputPath)
    prepare()
    start()
}

// 停止录制
mediaRecorder.stop()
mediaRecorder.release()

4. 视频录制

4.1 Camera2 API

Kotlin
val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
val cameraId = cameraManager.cameraIdList[0]

cameraManager.openCamera(cameraId, object : CameraDevice.StateCallback() {
    override fun onOpened(camera: CameraDevice) {
        // 相机已打开
    }
    override fun onDisconnected(camera: CameraDevice) {}
    override fun onError(camera: CameraDevice, error: Int) {}
}, null)

4.2 CameraX(推荐)

Kotlin
val preview = Preview.Builder().build()
val imageCapture = ImageCapture.Builder().build()
val videoCapture = VideoCapture.withOutput(Recorder.Builder().build())

val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

cameraProvider.bindToLifecycle(
    lifecycleOwner,
    cameraSelector,
    preview,
    imageCapture,
    videoCapture
)

5. 实践练习

练习1:音乐播放器

任务:实现完整的音乐播放器

要求: - 播放/暂停/下一首 - 进度条控制 - 后台播放

练习2:视频录制应用

任务:实现视频录制功能

要求: - CameraX相机预览 - 录制视频 - 保存到相册


本章小结

核心要点

  1. ExoPlayer是推荐的音视频播放方案
  2. CameraX简化相机开发
  3. 注意权限申请和生命周期管理

下一步

完成本章学习后,请进入第19章:模块化与组件化架构


本章完成时间:预计5-7天