AudioRecord 可以说简单的不能再简单了, 作用是从音频输入硬件读取音频数据, 而这个数据就是之前说的 PCM 编码的音频数据。
这个类的使用:
- 创建
- 开始录制
- 读取数据
- 停止录制
这里面唯一比较复杂的就是创建的时候, 因为之前我们说道,在编码成PCM信号的时候,有三个参数,采样率,采样位宽,声道。这三个参数决定了1s内数据的大小。
在创建的时候, AudioRecord 还需要一个 Buffer, 而这 buffer 的大小就是由上面的的参数决定的。
为什么需要一个 Buffer?(忘记启动问题模式了)
因为声音数据是不断采集的,而我们的读取数据的操作可能会间隔一定的时间,假如我们10s读取一次,缓存就应该缓存10s的数据,但是这就导致我们播放时声音延迟了10s,这样说来如果要实现低延迟,甚至是实时的耳反效果,就需要Buffer尽量小,甚至没有, 但是,因为采样率是很高的,一帧的时间很短的,如果我们1帧1帧的传递,花在传递上的时间也会很多,导致达不到希望的采样率。
所以, AuidoRecord 提供了一个获取最小Buffer的大小的方法,由底层决定它。(之前想实现一个耳反,做不到,总会有延迟,据说安卓上用ndk实现会好一些,改天试试)
还有什么高级点的吗
我发现一个规律, 很多时候,一个类的初始化比较复杂,而操作比较简单,这其实也好厉害,做大量的准备,采取小的行动,产生大的效果。
依赖注入的方式就很能体现这这种方式, 一个类的时候,将需要的某些功能的实现类在构造的时候传入, 之后执行某个行为,就会对各种类做各种操作。(.. 跑题了)
明天: 每天一点点音视频_AudioRecord_补充