一种音频频谱动画的绘制算法制造技术

技术编号:16328471 阅读:71 留言:0更新日期:2017-09-29 19:49
本发明专利技术涉及一种音频频谱动画的绘制算法,首先计算绘制基线baseX和频谱可绘制最大高度值height,复位wavePath的内部数据,通过循环,获取cacheFFTs数组中的偶数位置的频谱数据,经过坐标x、y的计算,使用wavePath的quadTo函数,增加到wavePath中保存为贝塞尔曲线绘制点;循环结束后,把最后的贝塞尔坐标与最开始的点通过调用close方法,进行直线封闭;调用canvas对象,首先保存当前状态,然后调用drawPath方法,把wavePath通过mForePaint1画笔绘制到界面。本发明专利技术,把频谱的傅里叶变换数组数据,转换为绘制所需要的屏幕坐标数据,再把屏幕坐标数据使用贝赛尔曲线显示出来。

【技术实现步骤摘要】
一种音频频谱动画的绘制算法
本专利技术涉及进度条显示
,具体说是一种音频频谱动画的绘制算法。
技术介绍
在Android中,自定义控件,主要包括两类:第一类,组合自定义控件,是指使用系统提供的各种界面控件,通过自定义封装成包括多个系统控件的自定义控件,代码在内部处理各子控件的交互,简化使用。第二类,自绘制控件,是指通过继承系统提供的各种界面控件,在控件的测量、布局、绘制三个方法中,使用代码进行测量、绘制、处理交互事件的自定义控件。自绘制控件能提供比系统控件更新颖的界面、更丰富的交互方式。频谱动画多在录音或播放音频时展示,通常是通过安卓自带的Visualizer类,获得频谱信息,得到一个byte数组。然后把这个byte数组转换成point数组,最后再根据这个point数组绘制点,就行了。但这种现有频谱动画显示效果缺乏美感,功能单一,人机交互过程有待进一步完善。在播放音频时还会在交互界面给出进度条,并且可以通过拖动进度条实现播放进度的相应控制。进度条通常是在独立的区域进行显示,同样也是功能单一,人机交互过程有待进一步完善。
技术实现思路
针对现有技术中存在的缺陷,本专利技术的目的在于提供一种音频频谱动画的绘制算法,把频谱的傅里叶变换数组数据,转换为绘制所需要的屏幕坐标数据,再把屏幕坐标数据使用贝赛尔曲线显示出来。为达到以上目的,本专利技术采取的技术方案是:一种音频频谱动画的绘制算法,其特征在于,包括如下步骤:首先计算绘制基线baseX和频谱可绘制最大高度值height,复位wavePath的内部数据,首先通过循环,获取cacheFFTs数组中的偶数位置的频谱数据,经过坐标x、y的计算,使用wavePath的quadTo函数,增加到wavePath中保存为贝塞尔曲线绘制点;循环结束后,把最后的贝塞尔坐标与最开始的点通过调用close方法,进行直线封闭;调用canvas对象,首先保存当前状态,然后调用drawPath方法,把wavePath通过mForePaint1画笔绘制到界面。在上述技术方案的基础上,x坐标是根据所绘制频谱数组数量与控件宽度可绘制区域平均等分得到,y坐标则通过控件的高度减去cacheFFTs中频谱数据的值得到。在上述技术方案的基础上,还包括:wavePath进行复位,再从头循环频谱数组cacheFFTs,获取其奇数位置的频谱数据,通过quadTo转换为path数据保存到wavePath中,最后通过canvas的drawPath方法,使用mForePaint2画笔绘制到界面上。在上述技术方案的基础上,还包括:通过调用canvas的restore方法恢复canvas状态。本专利技术所述的音频频谱动画的绘制算法,把频谱的傅里叶变换数组数据,转换为绘制所需要的屏幕坐标数据,再把屏幕坐标数据使用贝赛尔曲线显示出来。整个方案具有以下优点:1、实现了频谱展现与进度条功能结合统一,具有占用空间小,进度条变化与频谱动画和谐统一的优点。2、频谱动画使用贝赛尔曲线,间隔采样频谱数据,绘制两条贝赛尔曲线,两条曲线通过填充渐变色,使用颜色混合绘制模式,两条线条叠加创建了丰富的频谱展现效果。3、使用自创算法,把频谱的傅里叶变换数组数据,转换为绘制所需要的屏幕坐标数据,再把屏幕坐标数据使用贝赛尔曲线显示出来。4、使用自创算法,把频谱数据更新频率间隔与绘制的间隔进行插值匹配,在100毫秒的数据更新间隔中,实现三次绘制,绘制时分段变化频谱数据,实现动画的柔和展现。5、经过优化数据的计算及图形生成算法,可高效转换频谱数据为曲线图形并定时随数据变化,从而形成随频谱变动的动画效果。附图说明本专利技术有如下附图:图1本专利技术的流程图。具体实施方式以下结合附图对本专利技术作进一步详细说明。如图1所示,本专利技术所述的音频频谱动画的绘制算法,包括如下步骤:步骤1,基于View控件,自定义新的控件类mProgress,在构造函数处增加初始化方法;其中自定义新的控件类mProgress包括:创建频谱绘制使用的Path对象wavePath,并设置相应参数,所述参数至少包括频谱数组容量等参数,创建频谱变换使用缓存数组对象cacheFFTs,创建两条贝赛尔曲线绘制使用的Paint对象mForePaint1,mForePaint2,创建进度条绘制变量max、min、value,三个变量分别表示进度条最大值、最小值、当前值,所述自定义新的控件类mProgress使用这三个变量的换算值表示播放进度,其中初始化方法包括:初始化按键操作步进单位值,表示按键一次,变化多少;初始化进度条背景绘制用Paint对象lingBgPaint,初始化进度条进度绘制用Paint对象progressPaint,初始化进度条缓冲绘制用Paint对象secondPaint。步骤2,进行频谱数据的接收、变换,准备好频谱绘制用图形对象,启动异步绘制循环调用;具体步骤如下:步骤2.1,外部播放器回调接口,通过updateVisualizer方法把频谱数据传入,以进行频谱数据更新,所述频谱数据参数格式为float数组,左右声道的频谱数据,通过fft_left和fft_right二个数组(频谱数组)传入;步骤2.2,updateVisualizer方法进行以下判断:首先判断当前是否在停止绘制状态下,是在停止绘制状态下,则忽略本次频谱数据更新,然后判断当前是否在暂停动画状态下,是在暂停动画状态下,则忽略本次频谱数据更新,再后判断当前是否在插入柔和绘制频谱变化循环状态下,是在插入柔和绘制频谱变化循环状态下,则忽略本次频谱数据更新,上述三个忽略条件,都是为了提高控件自绘制效率;步骤2.3,上述三个忽略条件都不满足,则:使用cacheFFTs数组,分别从传入的频谱数据(fft_left和fft_right二个数组)中,获取左右声道中频率变化最丰富一端的指定数量的频谱数据,所述指定数量至少为32个,所述fft_left和fft_right二个数组,是外部播放器已经经过转换的512容量数组,但其中只有一半是有效数据(频谱数据),另一半是镜像数据(镜像频谱数据),所以这里根据绘制效果,只取其一端指定数量(32个)频谱数据,例如:左声道数组的取其最后面的32个频谱数据,右声道数组的取其最前面的32个频谱数据;步骤2.4,在cacheFFTs数组中,把右声道频谱数据追加到左声道频谱数据后面,形成一组频谱数据;如步骤2.3所举示例,指定数量为32个时,在cacheFFTs数组中就保存了64个频谱数据;步骤2.5,判断速度数组mSpeeds是否已存在,如不存在,则创建速度数组mSpeeds,如已存在,则复用速度数组mSpeeds;步骤2.6,使用cacheFFTs数组中的频谱数据,与在二次更新频谱数据前插值的次数相除,所述相除计算使用3次,其满足:设计在100ms的更新间隔中,每33毫秒插入频谱动画一次,得到以下参数:频谱数据中新的对应频谱数据,要想从上一次频谱数据,变化到新的频谱数据,所需要的速度,存入速度数组mSpeeds;例如:上一次频谱数组[0]是30,现在更新的对应频谱数组[0]的值是60,则计算速度既为10,表示从30向上变化到60,变化3次,则每次变化速度为10;更进一步,为防止一些频谱数据的突变,对速度做本文档来自技高网...
一种音频频谱动画的绘制算法

【技术保护点】
一种音频频谱动画的绘制算法,其特征在于,包括如下步骤:首先计算绘制基线baseX和频谱可绘制最大高度值height,复位wavePath的内部数据,首先通过循环,获取cacheFFTs数组中的偶数位置的频谱数据,经过坐标x、y的计算,使用wavePath的quadTo函数,增加到wavePath中保存为贝塞尔曲线绘制点;循环结束后,把最后的贝塞尔坐标与最开始的点通过调用close方法,进行直线封闭;调用canvas对象,首先保存当前状态,然后调用drawPath方法,把wavePath通过mForePaint1画笔绘制到界面。

【技术特征摘要】
1.一种音频频谱动画的绘制算法,其特征在于,包括如下步骤:首先计算绘制基线baseX和频谱可绘制最大高度值height,复位wavePath的内部数据,首先通过循环,获取cacheFFTs数组中的偶数位置的频谱数据,经过坐标x、y的计算,使用wavePath的quadTo函数,增加到wavePath中保存为贝塞尔曲线绘制点;循环结束后,把最后的贝塞尔坐标与最开始的点通过调用close方法,进行直线封闭;调用canvas对象,首先保存当前状态,然后调用drawPath方法,把wavePath通过mForePaint1画笔绘制到界面。2.如权利要求1所述的音频频谱动画的绘制...

【专利技术属性】
技术研发人员:纪广兴
申请(专利权)人:北京酷我科技有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1