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

news2024/11/24 6:33:38

文章目录

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

本文首发地址 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.coloradmin.cn/o/1469175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript+PHP实现视频文件分片上传

摘要 视频文件分片上传,整体思路是利用JavaScript将文件切片,然后循环调用上传接口 upload.php 将切片上传到服务器。这样将由原来的一个大文件上传变为多个小文件同时上传,节省了上传时间,这就是文件分片上传的其中一个好处。 上…

从故宫修建看「软件物料清单」的重要性 @安全历史01

故宫,这座中国传统文化的重要代表和象征性建筑已屹立近600年,是世界上现存规模最大、保存最为完整的木质结构古建筑之一。 故宫之所以能至今保存完好,除持续保护和修缮外,其使用的木材和砖石等材料也经过了精挑细选,保…

C++基础学习——哈希表的封装

目录 ​编辑 一,实现一个可封装的哈希表 1,哈希表的节点 2,哈希表的成员 3,哈希表成员方法的实现 4,迭代器的实现 5,在哈希表中加入迭代器 二,封装哈希表 1,unorder_map封装 2…

吴恩达deeplearning.ai:矩阵运算代码实战

神经网络向量化指的是将输入数据转化为向量形式,以便于神经网络的处理。向量化的作用包括以下几点: 提高计算效率:使用向量化的输入数据可以进行并行计算,加速神经网络的训练和推断过程。 减少存储空间:向量化可以将…

一种确定FET小信号等效电路的新方法

来源:A New Method for Determining the FET Small-Signal Equivalent Circuit(88年 TMTT) 摘要 - 提出了一种确定FET(场效应晶体管)小信号等效电路的新方法。该方法包括在低频段直接测定器件的外在和内在小信号参数。…

STM32_DS18B20_1_芯片简介及初始化配置

DS18B20介绍 DS18B20数字温度计提供9位到12位摄氏度的温度测量,并具有非易失性,用户可编程的上下触发点的报警功能。DS18B20通过1线总线进行通信,根据定义,该总线只需要一条数据线,即可与中央微处理器进行通信…

给定一个边与边可能相交的多边形,求它的轮廓线

大家好,我是前端西瓜哥。 最近遇到一个需求,给定一个多边形(边与边可能相交),求这个多边形的轮廓线。 需要注意的是,轮廓线多边形内不能有空洞,使用的不是常见的非零绕数规则(nonze…

2.23 Qt day4 事件机制+定时器事件+键盘事件+鼠标事件

思维导图&#xff1a; 做一个闹钟&#xff0c;在行编辑器里输入定闹钟的时间&#xff0c;时间到了就语音播报文本里的内容&#xff0c;播报五次 widget.h&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QDebug>//输出类 #include<…

JSON(javaScript Object Notation,Js对象标记)—我耀学IT

Json是一种轻量级的数据交换格式&#xff0c;目前使用非常广泛&#xff0c;是一种轻量级的数据交换格式。易于人阅读和编写&#xff0c;可以在多种语言之间进行数据交换 。同时也易于机器解析和生成 1.1json的值: 值可以是对象、数组、数字、字符串或者三个字面值(false、nul…

990-05产品经理:为什么商业价值是 IT 成功的关键

In today’s digital era, CIOs must shift(转移) their priorities from cost cutting to driving revenue(收入), and from process engineering to exploiting data if they want to achieve a set of broader business outcomes. Furthermore, understanding how to measur…

Mac OS 下载安装与破解Typora

文章目录 下载Typora破解Typora1. 进入安装目录2. 找到并打开Lincense文件3. 修改激活状态4. 重新打开Typora 下载Typora 官网地址&#xff1a;typora官网 下载最新Mac版&#xff0c;正常安装即可 破解Typora 打开typora,可以看到由于未激活&#xff0c;提示使用期限还剩下15…

09 呼吸灯

呼吸灯简介 呼吸灯实际展示的效果就是一个 LED 灯的亮度由亮到暗&#xff0c;再由暗到亮的变化过程&#xff0c;并且该过程是循环往复的&#xff0c;像呼吸一样那么有节奏。 呼吸灯通常是采用 PWM(Pulse Width Modulation&#xff0c;即脉冲宽度调制) 的方式实现&#xff0c;在…

超强随机短视频源码自带视频带支付源码

1.开启是否连续自动播放 2.支持手动点击看下一个 3.支持引流跳官方地址&#xff0c;产品地址&#xff0c;可以设置跳转地址 4.简洁大气&#xff0c;支持网站基础信息设置 5.支持设置定时多少时间弹广告 6.支持PC手机设置弹广告图片与点击后跳转链接 源码免费下载地址专业…

【Unity】双击C#脚本文件以单个文件打开(Visual Studio)、父类找不到、引用找不到、无法跳转等问题

问题&#xff1a;新安装一个Unity后&#xff0c;突然发现在工程里双击C#脚本&#xff0c;会一个一个打开&#xff0c;虽然也是用VS软件打开了&#xff0c;但是它无法被正确识别为Unity工程的C#脚本&#xff0c;也就是说所有命名空间无效&#xff0c;因为没关联上整个工程的解决…

OSCP靶场--Slort

OSCP靶场–Slort 考点(1.php 远程文件包含 2.定时任务提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.178.53 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-24 04:37 EST Nmap scan report for 192.168.178.53 …

Windows安装PHP及在VScode中配置插件,使用PHP输出HelloWorld

安装PHP PHP官网下载地址(8.3版本)&#xff1a;PHP For Windows&#xff1a;二进制文件和源代码发布 点击下载.zip格式压缩包&#xff1a; 历史版本在Old archives中下载。推荐在Documentation download中下载官方文档&#xff0c;方便学习。 下载完成后在一个顺眼的地方解压压…

Spring Boot 项目集成camunda流程引擎

使用camunda开源工作流引擎有&#xff1a;通过docker运行、使用springboot集成、部署camunda发行包、基于源代码编译运行等多种方式。 其中&#xff0c;通过源代码编译运行的方式最为复杂&#xff0c;具体参考&#xff1a;https://lowcode.blog.csdn.net/article/details/1362…

vivado VHDL Objects、VHDL实体描述

VHDL对象包括&#xff1a;信号、变量、常量和运算符。 信号 在中声明VHDL信号&#xff1a; •体系结构声明部分&#xff1a;在该体系结构内的任何位置使用VHDL信号。 •一个块&#xff1a;在该块中使用VHDL信号。 使用<信号分配运算符分配VHDL信号。 signal sig1 : std…

企业计算机服务器中了malloxx勒索病毒怎么办?Malloxx勒索病毒解密数据恢复

网络技术的不断更新与发展&#xff0c;为企业的发展提供了强有力数据支撑&#xff0c;在企业的生产运营过程中&#xff0c;企业数据扮演着重要的角色&#xff0c;通过企业数据可以更好地总结调整企业的规划发展方向与日常数据统计&#xff0c;但利用网络技术的支撑就要防范网络…

软考41-上午题-【数据库】-关系代数运算3-外连接

一、外连接 连接的拓展&#xff0c;处理由于连接运算而缺失的信息。 1-1、回顾自然连接 1-2、左外连接 示例&#xff1a; 左边的表&#xff0c;数值是全的 1-3、右外连接 示例&#xff1a; 右边的表&#xff0c;数值是全的 1-4、全外连接 示例&#xff1a; 自然连接左外连接…