没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
4页
Android录音支持的格式有amr、aac,但这两种音频格式在跨平台上表现并不好。 MP3显然才是跨平台的最佳选择。 项目地址 GavinCT/AndroidMP3Recorder 实现思路概述 在分析代码前,我们需要明确几个问题 1. 如何最终生成MP3 实现MP3格式最好是借助Lame这个成熟的解决方案。 对于Android来说,需要借助JNI来调用Lame的C语言代码,实现音频格式的转化。 2. 如何获取最初的音频数据 AudioRecord类可以直接帮助我们获取音频数据。 3. 如何进行转换 网上有代码是先录制后转为MP3,这种效率比较低。因为如果录音时间过长,转换时间就
资源详情
资源评论
资源推荐
Android录音录音mp3格式实例详解格式实例详解
Android录音支持的格式有amr、aac,但这两种音频格式在跨平台上表现并不好。
MP3显然才是跨平台的最佳选择。
项目地址
GavinCT/AndroidMP3Recorder
实现思路概述实现思路概述
在分析代码前,我们需要明确几个问题
1. 如何最终生成如何最终生成MP3
实现MP3格式最好是借助Lame这个成熟的解决方案。
对于Android来说,需要借助JNI来调用Lame的C语言代码,实现音频格式的转化。
2. 如何获取最初的音频数据如何获取最初的音频数据
AudioRecord类可以直接帮助我们获取音频数据。
3. 如何进行转换如何进行转换
网上有代码是先录制后转为MP3,这种效率比较低。因为如果录音时间过长,转换时间就会相应变长,用户在存储录音时需
要等待的时间就会变长。
Samsung Developers先录后转示例代码
显然,这种方案是不可取的。
我们需要的是边录边转的实现方式,这样在停止录音进行存储的时候,就不会花费太长时间。
实现代码介绍实现代码介绍
既然是录音,我们上面也提到了需要使用AudioRecord类,我们就从这个类的构造器开始说起
构造器
public AudioRecord (int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)
构造器参数很多,我们一点一点来看:
audioSource : 声源,一般使用MediaRecorder.AudioSource.MIC表示来自于麦克风
sampleRateInHz :官方明确说到只有44100Hz是所有设备都支持的。其他22050、16000和11025只能在某些设备上使用。
channelConfig : 有立体声(CHANNEL_IN_STEREO)和单声道(CHANNEL_IN_MONO)两种。但只有单声道
(CHANNEL_IN_MONO)是所有设备都支持的。
audioFormat : 有ENCODING_PCM_16BIT和ENCODING_PCM_8BIT两种音频编码格式。同样的,官方声明只有
ENCODING_PCM_16BIT是所有设备都支持的。
bufferSizeInBytes : 录音期间声音数据的写入缓冲区大小(单位是字节)。
其实从上面的解释可以看到,类的参数很多,但为了保证在所有设备上可以使用,我们真正需要填写的只有一个参
数:bufferSizeInBytes,其他都可以使用通用的参数而不用自己费心来选择。
在深究bufferSizeInBytes该传入什么之前,我们先略过这一段,先来说一下录音的读取与转换。
录音的读取与转换策略录音的读取与转换策略
录音的读取其实和UDP差不多,需要不断的读取数据。
既然是不断,那么我们当然需要循环读取,意味着我们需要一个线程来单独读取录音,避免阻塞主线程。
还和UDP差不多的是,如果不及时读取,数据超过缓冲区大小,会造成这段录音数据的丢失。
上面提到过,我们想要实现的是边录边转。那么问题来了,如果我们读取完数据后接着将数据传给Lame进行MP3编
码,Lame的编码时间是不确定的,是不是有可能造成数据的丢失呢?
答案当然是有可能,所以我们不能巧合编程。
我们需要另外一个线程,即数据编码线程来专门进行MP3编码,而当前的录音读取线程只负责读取录音PCM数据。
有了两条线程,我们还需要确认一点,什么时候编码线程开始处理数据?
编码线程处理数据的时机编码线程处理数据的时机
传统的方法是当线程中有数据的时候开始处理,这就需要在这个线程里面不断循环查看是否有数据需要处理,有数据就开始处
理,没有数据我们可以暂时休息几毫秒(当然一直不sleep也可以,但造成的系统消耗太多)。
这种方式显然也是低效的,因为无论我们让线程休息多久都可以判定为不合理。因为我们并不知道准确的时间。
那么还有别的方法么?
显然录音这个类是知道什么时候该处理数据,什么时候可以休息。
weixin_38562492
- 粉丝: 8
- 资源: 936
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0