前言:既然说是为变声这个功能而做,就我自己所了解的,原生中应该只有ffmpag,或者soundtouch可以实习,而这两种都涉及到NDK开发,这就有点难受了,当时公司是用的腾讯推广的变声器,后来因为老总发话,要求自己开发,当时看的是挺懵逼的,弱小的我,只能一点一点的研究。下面言归正传:

既然说了是为了变声这个功能模块,就先说一下音频基础:

声音属性响度(Loudness):音量,与声波的振幅有关音调(Pitch):音调与声音的频率有关——声音频率越大时,音调就越高,否则就越低音色(Quality):由物体结构特性所决定A/D转换(Analog-to-Digital Converter) 样本sample:声波 → 采样sampling → 量化quantization:将连续值离散化 → 编码coding:可由软件或硬件芯片完成 → (压缩compress):mp3等格式 → 二进制1010…10PCM(Pulse-code modulation,脉冲编码调制),是将模拟信号数字化的一种经典方式,计算机、DVD以及数字电话等系统中的标准格式采用的就是PCM。它的基本原理就是以上流程产生PCM流。另外,可以调整PCM的以下属性来达到不同的采样需求:采样率(Sampling Rate):多久采样一次。人耳所能辨识的声音范围是20-20KHZ,所以一般都选用44.1kHz、48kHz或者96kHz做为采样率。采样深度(Bit Depth):量化的离散值的位数,越高越精准,如32BitNyquist奈奎斯特采样定理 要完整重构原始模拟信号,则采样率必须是原始频率的两倍以上。数字音频格式未压缩:PCM数据是未压缩的数据,在计算机的存储格式一般是.wav(Windows)和.aiff(Mac)压缩: 无损压缩:一定程度上减少体积,如.flac、.m4a有损压缩:接受范围内有效减少体积,如.mp3、.aac声道channelmono,Monaural,单声道:只有1个音源录制的声音stereo,Stereophonic,立体声Surround Sound 4.1,4.1环绕立体声:左前+右前+左后+右后+低音炮Surround Sound 5.1,5.1环绕立体声,如杜比数字技术:左前+中置+右前+左后环绕+右后环绕+低音炮

简单介绍完音频基础后,相比应该是有了一些概念了,下面说一下SoundTouch

SoundTouch是一个用C++编写的开源的音频处理库,可以改变音频文件或实时音频流的节拍(Tempo)、音调(Pitch)、回放率(Playback Rates),还支持估算音轨的稳定节拍率(BPM rate)。ST的3个效果互相独立,也可以一起使用。这些效果通过采样率转换、时间拉伸结合实现。Tempo节拍 :通过拉伸时间,改变声音的播放速率而不影响音调。Playback Rate回放率 : 以不同的转率播放唱片(DJ打碟?),通过采样率转换实现。Pitch音调 :在保持节拍不变的前提下改变声音的音调,结合采样率转换+时间拉伸实现。如:增高音调的处理过程是:将原音频拉伸时长,再通过采样率转换,同时减少时长与增高音调变为原时长。处理对象 ST处理的对象是PCM(Pulse Code Modulation,脉冲编码调制),.wav文件中主要是这种格式,因此ST的示例都是处理wav音频。mp3等格式经过了压缩,需转换为PCM后再用ST处理。主要特性易于实现:ST为所有支持gcc编译器或者visual Studio的处理器或操作系统进行了编译,支持Windows、Mac OS、Linux、Android、Apple iOS等。完全开源:ST库与示例工程完全开源可下载容易使用:编程接口使用单一的C++类支持16位整型或32位浮点型的单声道、立体声、多通道的音频格式可实现实时音频流处理: 输入/输出延迟约为100ms实时处理44.1kHz/16bit的立体声,需要133Mhz英特尔奔腾处理器或更好

在Android 中使用:
1.下载源码
下载:soundtouch-1.9.2.zip ,包含ST的C++源码、Android-lib示例工程。
链接 :http://www.surina.net/soundtouch/sourcecode.html
2. 编译so这里可以根据需求来,根据需要去添加自己对应的so文件。如图:


3. 配置NDK
(1)在项目根目录下的gradle.properties中添加
android.useDeprecatedNdk=true
如果没有gradle.properties,从其他项目拷贝过来或者自己新建一个都可以。
(2)在local.properties中添加ndk路径(是你的ndk安装路径)
ndk.dir=ndk.dir=D:\java\androidstudio\sdk\ndk-bundle
(3)在app的build.pradle中添加:

externalNativeBuild {    ndkBuild {        path file("src\\main\\jni\\Android.mk")    }}

同时修改

minSdkVersion 14targetSdkVersion 27

这样就可以了,Dome在下面

传送门

最后,请小伙伴们关注一下公众号吧

更多相关文章

  1. android代码混淆压缩、资源压缩全解析
  2. Android(安卓)compress图片压缩介绍
  3. android中bitmap压缩的几种方法详解
  4. android多媒体篇-音频-1 音频相关基础知识
  5. Android使用huffman编码进行图片压缩
  6. 安卓图片反复压缩后为什么普遍会变绿而不是其它颜色?
  7. Android图片压缩上传之基础篇
  8. Android(安卓)MP3文件录制 + 声音分贝大小自定义View实现
  9. Android一键压缩Git提交的图片

随机推荐

  1. android 获取屏幕高度和宽度
  2. Android--WindowManager.LayoutParams(上
  3. android 模拟滑动事件
  4. Android:BT测试代码
  5. Android 判断程序是否在前台运行
  6. android如何禁止安装第三方应用
  7. Android Studio3.0 Error:Execution fail
  8. Android 中实现FlowLayout 布局
  9. Android 异常后如何重启应用
  10. Android实现图片缩放示例