Android系统音频PCM波形图绘制算法与实现_梁浩
"Android系统音频PCM波形图绘制算法与实现" 音频处理是Android系统中的一项重要功能,Android系统音频处理主要使用两个类MediaPlayer和SoundPool,MediaPlayer类提供了播放、暂停、停止和重复播放等方法,SoundPool可以播一些短的反应速度要求高的声音, 比如游戏中的爆破声,这两个类缺点是无法控制底层音视频解码过程。自Android 4.1版本,增加MediaCodec类,支持从Native层直接获得编解码数据。 音频数字化是将声音经过麦克风,转换成一连串电压变化的信号,使用三个参数来表示声音,它们是:声道数、采样位数和采样频率。采样频率,即取样频率,指每秒钟取得声音样本的次数。采样频率越高,声音的质量越好,声音的还原也就越真实。由于人耳的分辨率很有限,太高的频率并不能分辨出来。在16位声卡中有22K Hz、44K Hz等几级,其中,22K Hz相当于普通FM广播的音质,44K Hz已相当于CD 音质了,目前的常用采样频率都不超过48K Hz。 PCM波形图绘制算法是将PCM音频数据转换为可视化的波形图, Android屏幕坐标系与Canvas坐标系的关系是屏幕的起始坐标在屏幕的左上角,由(0,0)坐标向下Y 坐标增长,向右横坐标增长。Canvas类在屏幕上绘图,理论上讲Canvas无限大,为了更好的绘制PCM波形图可以规定CanvasHeight等于ViewHeight,使得PCM波形的上下限在手机屏幕之内。 PCM波形图绘制算法可以分为三步骤: 第一步骤是将PCM音频数据采样数与Canvas横坐标点数比较,得到数据宽度dataStep= dataLen/ canvsWidth。如果dataStep大于等于1,说明Canvas中每个点需对应PCM数据中的多个点,此时将PCM数据分成dataLen/ dataStep份,每dataStep个数据作为一份,每一份对应Canvas横轴上的唯一一点,求得每一份dataStep个数据中的最大值和最小值,将其作为两个点的纵坐标,横坐标为对应的第几个Canvas的横轴点的坐标。连接每一份中的最大值点和最小值点即可绘制完整波形图。 第二步骤是如果dataStep小于1,说明PCM数据数小于Canvas横坐标点数,此时Canvas横轴上每1/ dataStep个点描绘一个PCM点,将所有相邻PCM点连成线段即可绘制完整波形图。 第三步骤是对算法进行效率改进,例如只绘制Canvas中落在手机屏幕View中的坐标点,而不是完整的绘制Canvas中的所有坐标点。如果dataStep数值很大,可以设置一个数据洞dataHole,不必比较每一份中的所有dataStep各数据,比较每次dataStep/dataHole相间隔的数据,此时效率提高dataHole倍。 绘制PCM波形图算法实现可以使用Java语言,使用Canvas类在屏幕上绘图,使用Paint类设置画笔的颜色和样式,使用Path类绘制波形图的路径,使用Canvas的drawPath方法绘制波形图。
- 粉丝: 1
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
- 3
- 4
前往页