文章目录
本文首发地址 https://h89.cn/archives/146.html
源码地址: Gitee: OpenGLRecorder
前言
通过 前文 我们知道了如何采集 Camera 视频,叠加水印、贴纸保存为MP4,但是录制视频并没有音频。本文将详细介绍如何实现音视频同步录制,以及在实际应用中的一些关键技术点和最佳实践。
视频处理流程
在开始音频处理之前,让我们先回顾一下视频处理的核心流程和关键类:
1. 视频预览
- CameraGlView
- 继承自 GLSurfaceView
- 用于显示Camera预览画面
- 负责管理OpenGL上下文和渲染线程
2. 视频数据流处理
-
相机预览初始化
mSurfaceTexture = new SurfaceTexture(mTextures[0]); mCameraHelper.startPreview(mSurfaceTexture);
通过 CameraRenderer.java 创建 SurfaceTexture 来接收相机数据
-
OpenGL渲染链
- CameraFilter.java
- 将Camera数据写入FBO(Frame Buffer Object)
- 实现基础的图像处理
- TimeFilter.java
- 在FBO上叠加时间水印
- 此处可扩展实现贴纸、美颜等特效
- ScreenFilter.java
- 将处理后的FBO内容绘制到屏幕
- CameraFilter.java
-
视频编码与存储
- MediaRecorder.java
- 使用MediaCodec进行H.264编码
- 通过EGL将Surface内容采集并编码
- 将编码后的数据写入MP4文件
- MediaRecorder.java
音频处理实现
音频处理是视频录制中不可或缺的一部分,主要包含以下几个关键步骤:
1. 音频采集
使用 AudioRecordPcm.kt 实现音频采集:
- 使用AudioRecord API采集PCM原始音频
- 支持配置采样率、声道数等参数
- 实现音频数据的缓存和回调
2. 音频编码
通过 PcmEncodeAacCtrl.kt 处理音频编码:
- 将PCM数据编码为AAC格式
- 使用MediaCodec进行硬件加速编码
- 处理编码过程中的异常情况
3. 音频封装
在 MediaRecorder.java 中实现音频数据的封装:
- 创建音频轨道(AudioTrack)
- 使用writeSampleData写入编码后的音频数据
- 确保音视频同步写入
性能优化与注意事项
1. 音视频同步
在实际应用中,需要特别注意以下几点:
- 使用pts(显示时间戳)确保音视频同步
- 控制音频采集和编码的缓冲区大小
- 处理音频数据积压和追帧逻辑
2. OpenGL资源管理
在当前实现中发现了OpenGL资源泄露问题:
泄露分析和解决方案:
- 使用Perfetto工具分析内存泄露,详见Android性能优化–Perfetto分析native内存泄露
- 具体修复方案参见issues
- 建议在Activity销毁时主动释放OpenGL资源
3. 最佳实践建议
-
异常处理
- 处理音频设备被占用的情况
- 优雅处理编码器初始化失败
- 合理处理录制过程中的中断
-
性能优化
- 使用合适的音频缓冲区大小
- 避免频繁的音频格式转换
- 合理配置编码参数
总结
完整的视频录制流程如下图所示:
本文详细介绍了Android中使用OpenGL实现视频录制的完整方案,包括:
- 视频预览和处理流程
- 音频采集和编码实现
- 音视频同步方案
- 性能优化和注意事项
通过合理使用OpenGL、MediaCodec等API,我们可以实现一个功能完善、性能优秀的视频录制功能。
参考文章:
- OpenGL ES SDK for Android: High Quality Text Rendering
- Github:opengl-es-sdk-for-android/HighQualityTextJava
- Github:android-openGL-canvas
- Github:Media for Mobile is a set of easy to use components and API for a wide range of media scenarios such as video editing and capturing
- VideoRecorder高性能任意尺寸视频录制 断点录制 离屏录制 录制时的Canvas API支持 实时滤镜,相关资料介绍Link
- 抖音录制视频预习资料
相关文章
安卓MediaRecorder(1)录制音频的详细使用
安卓MediaRecorder(2)录制源码分析
安卓MediaRecorder(3)音频采集编码写入源码分析
安卓MediaRecorder(4)视频采集编码写入源码分析