需求:
- 使用一份音频输入数据分别采样Mp3和Amr音频编码需要的数据。
前提条件:
- Mp3文件需要采样率是44.1KHZ的音频数据流
- Amr文件需要采样率是8,000 Hz或者16,000 HZ采用率的音频数据流
具体实现:
- 创建音频采集线程,采样音频数据
|
|
- 思路
由于amr是码率50fps的。所以每个frame需要的数据源就是8000/50=160个short
现在对应在44100上就是每个frame 44100/50 = 882 个short
然后就是从44100采样的每882个short里拿出160个给amr用
也就是每5.5125个short拿一个short放到amr的Buffer里
这个Buffer每满160就拿去encode
然后接着从audioBuffer里拿
- 首先如果要保证声音的连续性就得首先获取882个short中这160个short的下标
|
|
- 获取进行编码的数据
|
|
- 坑
后来发现一些移动设备并不支持44.1KHZ的采样率,在AudioRecord.getMinBufferSize() 方法获取音频缓冲区大小的时候返回负数。
在测试了多个设备的可以支持的采样率之后,确定采样率为比较通用的8,000 Hz。
- 方案
- 更改音频采集器采样率为8000 Hz
- 扩充数据,拿取到需要编码的数据
|
|
MP3编码用的是从mp3lame官网下载的源码然后重新编译的mp3lame.so库。
Amr编码使用的是Android自带的media_jni.so库