BY http://blog.csdn.net/ranxiedao 谢绝转载!
上一篇文章中详细讲述了 ilbc 在Android平台的移植和编译,现转到Java层,实现音频的采集和处理操作,本示范中的程序流程图如下:
顺便提一下:因为是在Ubuntu下写的博客,所以没有一个现成的工具来绘制流程图,后来网上找到一个在线绘图网站:
http://creately.com/ 感觉非常不错,绘制功能强大,推荐给大家,需要注册才能使用。
图解:
1. 发送端有三个主要的类:AudioRecorder(负责音频采集),AudioEncoder(负责音频编码),AudioSender(负责 将编码后的数据
发送出去); 这三个类中各有一个线程,录制开始后,这三个线程一起运行,分别执行各自的任务, AudioRecorder采集音频后,添加到
AudioEncoder 的音频数据的List中,而AudioEncoder 的编码线程不断从List头部取出数据,调用 ilbc 的底层\函数进行编码,编码
后的数据则又添加到下一级的AudioSender的 List中,AudioSender又不断从头部取出数据,然后发送出去;
2. 使用Android 系统自带的 AudioRecord 这个类来实现音频数据的采集,注意要在AndroidManifest.xml文件中加上权限
android.permission.RECORD_AUDIO ,使用 AudioRecord 时,一定要配置好一些音频参数,比如采样频率, 采样格式等,具体将在
后续代码中详细写出;采集方法是 AudioRecord 中的 read(samples, 0, bufferSize) ;
3. AudioEncoder 对数据编码一次后,交付给AudioSender 让其发送到服务器,发送方采用 UDP 协议,采集一次数据 长度为960B,
编码后长度为100B ,所以一个 UDP 包就非常小,既节省带宽,又减少丢包率;
4. 接收端有三个主要的类:AudioReciever(负责接收UDP 包),AudioDecoder(负责解码音频),AudioPlayer(负责音频播放),
大致流程 在上图中已经详细给出,这里不做说明了,只不过就是 发送方流程的逆序。播放音频使用的是Android中的AudioTrack 这个类,
使用write(byte[] data , int sampleOffset ,int sampleLength) 方法能够直接播放音频数据流;
5. 发送方有三个线程,接受方也有三个线程,一一对应,下一篇正式开始贴代码 ;