音视频开发路线:

Android 音视频开发入门指南_Jhuster的专栏的技术博客_51CTO博客_android 音视频开发入门

demo地址:

GitHub - wygsqsj/videoPath: 音视频学习路线demo

音频

上几个节点我们只是通过对音频的操作熟悉了MediaCodec、MediaExtractor、MediaMuxer的使用,这一节说一下音频的一些基本概念,并将这几个API联合起来,将两个mp3合并成一个mp3文件。

首先声音是一种波形,我们在很多音乐软件或者剪辑软件中都看到音频的展示形式就是波形

波形是有周期的,比如从波的最高点到下一个最高点就可以看作一个周期,我们的麦克风就是将音频转换成数字存储下来,但是如果波形中每个点都进行采集我们的音频数据就会超级大,是不可取的,所以对应波形来说,采样点要在满足尽量还原波形和减少采样点数之间取一个平衡值。

音量:音量是通过波形的振幅控制,即波的上下范围越大,音量越高,对应到我们的音频数据上来说就是对原数据进行乘法运算就行,音量0就是音频数据 * 0;音量的单位是db

音调:声音在固定时间中的周期变化次数,也就是频率,我们说某个人音特别高就是他的频率更快,这种周期变化次数的单位就是HZ,人的耳朵能接受的hz上限是44100,常用的采样率有:8kHz/11.025kHz/22.05kHz/16kHz/37.8kHz/44.1kHz/48kHz

通道:采集音频时的通道数量,如果要做立体声,比如影院那种几个喇叭环绕你,如果你的声音是单声道采集的,是没办法把声音拆分成6个部分环绕播放,通道越多,采集的数据就越丰富

对于音频我们用两个字节存储,波形我们通过存储值得正负来还原,音频得表示范围在:-32768~32767之间,我们在初始化音频采集得时候需要指定音频数据的格式,各个格式的摆放顺序如下,记住返回的音频数据格式里低8位在前,高8位在后就可以了

混音

基本思路初:

1.始化两个分离器MediaExtractor,两个解码器MediaCodec,一个合成器MediaMuxer,一个编码器MediaCodec

2.从两个MP3中读取数据解码成pcm原始文件,对两个pcm文件进行合成

3.将合成后的pcm数据重新编码生成mp3文件

注意点就是PCM文件的混音方法,此处我们仅仅是简单的实现了混音,原理就是从音频1中取出两个byte,音频2中取出两个byte,因为2个byte代表一个完整的音频采样,在音频数据的排列中低8位在前,高8位在后,所以先把高8位和低8位顺序回复正常,获得正常的采样数据

 temp1 = (short) ((mixAudio1[i] & 0xff) | ((mixAudio1[i + 1] & 0xff) << 8));

将2个音频相加即可得到混音后的数据,因为两个short类型的音频相加之后,可能会超过short表示的数值,超过的我们就丢弃了,所以可能会丢失数据,其他的混音方式可以参考:

Android中一种效果奇好的混音方法详解 - 云+社区 - 腾讯云

private void mixingAudio() {Log.i(LOG_TAG, "当前audio1集合大小:" + audioQueue1.size());Log.i(LOG_TAG, "当前audio2集合大小:" + audioQueue2.size());byte[] mixAudio1 = audioQueue1.poll();byte[] mixAudio2 = audioQueue2.poll();if (mixAudio1 != null && mixAudio2 != null) {Log.i(LOG_TAG, "audio1混合数据大小:" + mixAudio1.length);Log.i(LOG_TAG, "audio2混合数据大小:" + mixAudio2.length);audioData3 = new byte[mixAudio1.length];//一个声音采样占2个字节,用short标识即可//将两个short字节相加,得到混合后的音频for (int i = 0; i < mixAudio1.length; i += 2) {//声音数据的排列顺序为低8位在前,高8位在后,此处还原为真实的数据,即低8位放到后面,高8位放到前面temp1 = (short) ((mixAudio1[i] & 0xff) | ((mixAudio1[i + 1] & 0xff) << 8));if (i + 1 < mixAudio2.length) {temp2 = (short) ((mixAudio2[i] & 0xff) | ((mixAudio2[i + 1] & 0xff) << 8));//声音大小的控制通过振幅来控制,用当前字节*对应的音量即可得到temp1 = (short) (temp1 * volume1 / 100f);temp2 = (short) (temp2 * volume2 / 100f);temp3 = temp1 + temp2;//超出的部分舍弃掉if (temp3 > 32767) {temp3 = 32767;} else if (temp3 < -32768) {temp3 = -32768;}} else {temp3 = temp1;}//存入新的数据中audioData3[i] = (byte) (temp3 & 0xff);audioData3[i + 1] = (byte) ((temp3 >> 8) & 0xff);}audioQueue3.add(audioData3);} else {if (hasAudio1 && !hasAudio2 && mixAudio1 != null) {Log.i(LOG_TAG, "当前音频1未写入:" + mixAudio1.length);audioQueue3.add(mixAudio1);}if (!hasAudio1 && hasAudio2 && mixAudio2 != null) {Log.i(LOG_TAG, "当前音频2未写入:" + mixAudio2.length);audioQueue3.add(mixAudio2);}}
}

代码示例,具体代码参见videoPath/Demo5Activity.java at master · wygsqsj/videoPath · GitHub

//Muxer获取音频轨道,得到format,取出数据
getTrack1();
getTrack2();
//构建MediaCodec解码音频成pcm数据
initMediaCodec1();
initMediaCodec2();
//构建编码器
initEncodeMediaCodec();while (!finishWrite) {//解码成pcmdecodeAudio1();decodeAudio2();//将两个pcm数据相加混合成新的数据mixingAudio();//重新编码写入新的mp3文件中writeNewAudio();
}

音视频5.4——两个MP3混音合成一个MP3相关推荐

  1. Android视频编辑器(五)音频编解码、从视频中分离音频、音频混音、音频音量调节等

    前言 这篇博客,主要讲解的是android端的音频处理,在开发Android视频编辑器的时候,有一个非常重要的点就是音频的相关处理.比如如何从视频中分离音频(保存为mp3文件),然后分离出来的音频如何 ...

  2. 【视频】国产电子核混音|Lost In Summer - Release The Soul |混音母带处理 by JeromeAlanChan

    大家好,我是Jerome,欢迎来到MZD Studios混音之道. 2018年末后期混音制作的一首国产电子核,效果怎么样?视频看起. [B站视频请戳: Jerome-Alan-Chan] 高音质请到网 ...

  3. android硬编码封装mp4,【Android 音视频开发打怪升级:音视频硬解码篇】四、音视频解封和封装:生成一个MP4...

    [声 明] 首先,这一系列文章均基于自己的理解和实践,可能有不对的地方,欢迎大家指正. 其次,这是一个入门系列,涉及的知识也仅限于够用,深入的知识网上也有许许多多的博文供大家学习了. 最后,写文章过程 ...

  4. 音视频技术开发周刊:FFmpeg内置的一个无中生有的音视频输入数据 | 214

    每周一期,纵览音视频技术领域的干货. 新闻投稿:contribute@livevideostack.com 火山引擎视频云:坚持基础技术创新,打造极致用户体验 从toC到toB,作为抖音背后的视频技术 ...

  5. 如何给抖音视频选择配乐?音乐是抖音作品重要的组成部分

    一个好的配乐对作品有着至关重要的作用,即使一个普通的视频,如果搭配了一个恰当的配乐,那么这个作品也会表现的非常好.在抖音上面我们应该都看到过这样的作品:只能简单的一个镜头,但是因为一个恰当的音乐,当两 ...

  6. 微信小程序 RTMP 音视频 通话 ffmpeg_WebRTC与微信小程序音视频互通方案设计与实现...

    背景 在之前的WebRTC实时音视频通话之语音通话设计与实践中介绍了58 TEG部门基于 WebRTC 的实时音视频通话解决方案. 考虑到腾讯微信的小程序平台提供了音视频通话与直播的支持,如果能打通基 ...

  7. 安卓音视频入门难,老司机分享音视频开发学习技巧与痛点

    最近在写文章的时候,发现很多读者给我私信提问,想了解安卓音视频这块, 很多同学也对音视频开发有点浓厚的兴趣,但奈何没有系统的学习知识,仅靠自己苦苦钻研确实力不从心,今天就借这个机会分享一下我学习音视频 ...

  8. 基于iOS的网络音视频实时传输系统(二)- 捕获音视频数据

    下载 GitHub: client 端:https://github.com/AmoAmoAmo/Smart_Device_Client server端:https://github.com/AmoA ...

  9. android lame音频转换,音视频开发02--使用LAME库转换pcm文件到mp3

    android 使用 AudioRecord 对麦克风进行录音得到的是 pcm 格式的原始音频数据,pcm文件是不能用来播放的,需要进行编码压缩. LAME是目前非常优秀的一种MP3编码引擎,在业界, ...

最新文章

  1. 2020腾讯广告算法大赛:赛题理解与解题思路
  2. 入职大厂,我容易吗?
  3. SQLServer 扫盲
  4. sencha touch list(列表)、 store(数据源)、model(模型)详解
  5. java基本数据类型_老杜带你学Java【第六课】
  6. 第一周 01-复杂度2 Maximum Subsequence Sum
  7. mysql二级封锁协议_MySQL 行锁、两阶段锁协议、死锁以及死锁检测
  8. linux分区设置大小,Linux调整磁盘分区大小
  9. threejs- z-fighting 问题
  10. Qt模仿游戏拖装备(换装备)
  11. javascript-封闭函数的定义与使用
  12. the dhc driver package_DHC智商低?不,它用1k阅读,444个好看证明了自己
  13. 为jquery.AutoComplete添加触发事件
  14. c# mysql 汉字乱码_在C#和MySQL中存取中文字符时避免乱码的方法
  15. 第四十七节,random 随机数模块
  16. 【Julia】 解决安装包下载慢的问题
  17. Xiangqi UVA - 1589
  18. KOC十问:品牌缺钱的谎言,还是新瓶装旧酒?
  19. minIO如何设置直接通过访问链接在浏览器中打开文件
  20. 龙ol服务器维护补偿boss,《龙OL》12月17日更新公告

热门文章

  1. 大数据学习之环境构建
  2. IM互通新方案-GTalk to VoIP回拨服务
  3. 华为IT总监离职时给大家写了一封告别信(ZT)
  4. vb/java/c# 生成code128 条码/QR Code二维码 导出excel
  5. 光纤收发器tx和rx,光纤收发器单模和多模的区别!
  6. 手把手教你如何在广交会使用OBS直播丨汇信外贸软件
  7. 模型量化论文阅读#1----综述:A Survey of Quantization Methods for Efficient Neural Network Inference
  8. python解题时间_1小时还是30秒?Python给你的另一种数据处理选择
  9. leetcode 18. 四数之和 (C++)
  10. Circular Billiard Table(计算几何)