Android如何实现音频合成
发布日期:2021-09-28 18:45:50 浏览次数:9 分类:技术文章

本文共 1373 字,大约阅读时间需要 4 分钟。

在说这个话题之前需要知道几个重点:

1.mediaRecorder/audioRecord区别
mediaRecorder是系统提供常用的录音类,该类可以实现音频录音生成文件。audioRecord也是系统提供的录音类,但是他可以直接捕获音频流,开发者可以实时随意处理其内容。常见的场景比如语音聊天/tom猫/k歌。
2.riff/wav/pcm/raw/mp3
riff是一种文件描述格式,wav文件就采用了riff描述,其前44字节就是riff描述内容。pcm就是媒体数据的元数据,直接记录声音内容的。wav = riff + pcm,raw = pcm,而mp3是一种压缩编码,大概的意思就是将pcm通过算法压缩。
3.采样率,比特率,通道数,采样值
采样率是模拟信号采集频率(每秒样本数),采样率越高声音还原越真实;比特率是模拟信号转为数字信号后的采样率;采样值又称每样本数据位数,常见8位与16位;通道常见有单通道和双通道,单通道每样本占用8/16位,双通道每样本占用16/32位,且高8/16位是左声道,低8/16位是右声道;

然后我们再来讨论如何实现音频合成:

1.首先我们需要获得用户声音就需要录音类,需要同步处理数据就只能用audioRecord了
2.录制的声音是pcm即元数据,我们需要与另外一个声音文件合并,这样就必须将另外一个文件解码为pcm数据
3.获得录音与伴奏的pcm数据之后进行混合,混合算法后面再说,简单的来说就是算每位字节的平均值
4.得到混合后的音频pcm之后进行再编码,比如以最终生成wav格式为例,只需要在pcm数据前加入44字节的riff描述即可。

实现过程中遇到的问题:

1.录音失真:在测试的过程中发现录音文件播放速度非常快,经分析发现是wav文件头描述与文件实际内容不匹配导致,比如我采用44100采样率,单声道,16位采样值录音,但是riff中写的是双声道,因此算出来的播放时间比实际时间少了一半,所以播放速度加倍。得出来的结论就是riff描述内容一定要与pcm实际内容匹配,否则就会导致播放声音异常。----由此也可以推断只要文件能播,但是播放效果异常就说明多半是riff与pcm类型不匹配导致的.
2.部分文件不支持:出现概率很小,可能是文件本身编码问题。
3.录音过程耗时:audioRecord.read的时候会阻塞耗时,所以会出现mediaPlayer播放完了,录音只录到一半。

4.混合算法:理论上混合算法就是每位字节相加除以位数求平均数即可,但前提条件是两个文件的通道数&采样值必须一样。之前也解释过通道数与采样值的作用,所以很好推断如果采样值之前是8bit要合16bit,就先要byte转short再叠加求均数;如果是单通道要合双通道就写算法加在前半位或后半位;双通道转单通道就前半位与后半位叠加后算平均数之后再与单通道叠加算平均数.

5.Android设备只能以单声道的形式录制,即使传入双声道的参数运行不报错,也只能将生成的PCM当作单声道文件处理。

========================福利============源码========================

Android audioRecord录音Demo

Android音频混合 -- K歌合成

转载地址:https://blog.csdn.net/h3c4lenovo/article/details/8113374 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Ubuntu 64 位 Error : Failed to create sdcard in the AVD folder.
下一篇:Android apk dex与odex

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月25日 12时23分32秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

android开发的取消清空按钮,Android开发实现带清空按钮的EditText示例 2019-04-21
android gp服务,ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用) 2019-04-21
mysql整体会滚_滚mysql 2019-04-21
向mysql数据库中添加批量数据类型_使用JDBC在MySQL数据库中快速批量插入数据 2019-04-21
最全的mysql 5.7.13_最全的mysql 5.7.13 安装配置方法图文教程(linux) 强烈推荐! 2019-04-21
mssql连接mysql数据库文件_在本地 怎么远程连接MSSQL数据库 2019-04-21
mssql 远程无法连接mysql_解决SQLServer远程连接失败的问题 2019-04-21
linux mysql c++编程_Linux下进行MYSQL的C++编程起步手记 2019-04-21
Maria数据库怎么复制到mysql_MySQL、MariaDB数据库的AB复制配置过程 2019-04-21
mysql5.6 icp mrr bak_【mysql】关于ICP、MRR、BKA等特性 2019-04-21
mysql utf8跟utf8mb4_MySQL utf8 和 utf8mb4 的区别 2019-04-21
docker mysql开机自启动_Docker学习4-学会如何让容器开机自启服务【坑】 2019-04-21
在mysql中删除表正确的是什么_在MySQL中删除表的操作教程 2019-04-21
mysql有3个共同好友_共同好友mysql 2019-04-21
代理查询 mysql_查询数据库代理设置 2019-04-21
mysql dif_mysqldiff实现MySQL数据表比较 2019-04-21
mysql 允许其他主机访问权限_允许其他主机访问本机MySQL 2019-04-21
druid不能close mysql连接_alibaba druid mysql连接问题 2019-04-21
mysql 设置按天分表_MySQL 优化实战记录 2019-04-21
java连接mysql 不推荐_java连接mysql 2019-04-21