当前位置: 首页 > news >正文

安卓OpenGL添加水印并录制(二)---抖音录制原理

文章目录

    • 前文回顾
    • 音频处理
    • 留个小思考
    • 总结

本文首发地址 https://h89.cn/archives/146.html
最新更新地址 https://gitee.com/chenjim/chenjimblog
源码地址: Gitee: OpenGLRecorder

通过 前文 我们知道了如何采集 Camera 视频,叠加水印、贴纸保存为MP4,但是录制视频并没有音频,本文进一步介绍添加音频录制实现。

前文回顾

前文介绍的视频处理流程及主要类如下

  1. CameraGlView 用来显示Camera预览的View
  2. 创建 SurfaceTexture 来显示 Camera 预览,参见 CameraRenderer.java
  3. CameraFilter.java,通过 OpenGL 将 Camera 数据写入 FBO(Frame Buffer Object 帧缓存)
  4. TimeFilter.java,通过 OpenGL 在 FBO 上添加时间水印。可以参考此处添加贴纸、美颜等。
  5. ScreenFilter.java,将 FBO 绘制到 mSurfaceTexture
  6. MediaRecorder.java,用 MediaCodec 和 EGL 对 Surface 的内容采集编码为 avc 并写入到 MP4 文件

音频处理

音频处理主要分为采集、编码、写入几个阶段,对应的实现如下所述

  1. 我们可以使用 AudioRecord 采集音频,具体实现参见 AudioRecordPcm.kt
  2. 对采集到的 PCM 帧通过 MediaCodec 编码为 AAC ,具体实现参见 PcmEncodeAacCtrl.kt
  3. 将编码后的音频写入到 MP4 文件,这里只需增加 AudioTrack ,然后 writeSampleData 即可,具体实现参见 MediaRecorder.java

注意时序问题,在快速极端操作,可能会有异常,如果你遇到,欢迎留言讨论解决。

留个小思考

在当前代码中存在 openGL 泄露 , 通过 perfetto 分析结果如下

使用 perfetto 分析 GL 泄露的方法,可以参见 Android性能优化–Perfetto分析native内存泄露
解决结果参见 issues

总结

综上所述,即为抖音视频录制的基本实现,整个过程的数据流如下图

希望本文对你有所帮助,若使用遇到问题,可以留言讨论。


参考文章:

  • 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)视频采集编码写入源码分析


http://www.lryc.cn/news/305410.html

相关文章:

  • 动态绑定样式,uniapp,用三元运算动态绑定多个class类样式,动态绑定的样式可以和原始样式共存
  • 神经网络基础——激活函数的选择、参数初始化
  • ElasticSearch之聚合aggs
  • Android 系统定位和高德定位
  • Day20_网络编程(软件结构,网络编程三要素,UDP网络编程,TCP网络编程)
  • https://registry.npm.taobao.org淘宝npm镜像仓库地址更新
  • 离散数学(一) 集合
  • IOS不使用默认的mainStroryboard作为首个controller的方法
  • Qt(C++)面试题 | 精选25项常问
  • 个人博客系列-环境配置-gitee(2)
  • DevOps 周期的 6 个 C
  • 九、计算机视觉-形态学基础概念
  • 杰发科技AC7801——SRAM 错误检测纠正
  • 普中51单片机学习(AD转换)
  • YoloV8改进策略:主干网络改进|MogaNet——高效的多阶门控聚合网络
  • Sora:OpenAI引领创新浪潮的AI视频模型
  • torch报错:[winerror 126] 找不到指定的模块torch_python.dll“ or one of its dependencies.
  • Linux日志轮替
  • Docker Container(容器)
  • week04day03(爬虫 beautifulsoup4、)
  • 04 动力云客之登录后获取用户信息+JWT存进Redis+Filter验证Token + token续期
  • RISC-V知识总结 —— 指令集
  • 基于Java jsp+mysql+Spring的汽车出租平台租赁网站平台设计和实现
  • [AutoSar]BSW_Com 01 Can通信入门
  • 离散数学 第七单元 tree
  • 基于MPPT最大功率跟踪算法的涡轮机控制系统simulink建模与仿真
  • Hbase和Clickhouse对比简单总结
  • Spring基础之AOP和代理模式
  • 二层交换机和三层交换机区别
  • 【Java程序设计】【C00267】基于Springboot的在线考试系统(有论文)