一种音频方形频谱生成方法与流程

文档序号:14129832阅读:241来源:国知局

本发明涉及音频频谱技术领域,具体说是一种音频方形频谱生成方法。



背景技术:

在音乐赏析时,为了丰富用户的体验,增强个性化,往往会提供在音乐播放时同步的在屏幕上显示音频频谱的功能。

音频频谱(简称频谱)是将声音的频率图形化,可视的呈现给用户,因此,频谱算音乐可视化的一种,把音乐的实时频谱用一些复杂的算法进行处理,转为画面显示出来,增强视觉上的美感。

在各种音频频谱的显示方案中,方形频谱是其中的方案之一,其横坐标表示播放的时间,频谱高低显示的是声音的大小,但现有技术中没有统一、可靠的方形频谱生成算法,导致方形频谱的生成不够理想,容易出现卡顿的情况,展现方形频谱的动画效果时流畅度不好。



技术实现要素:

针对现有技术中存在的缺陷,本发明的目的在于提供一种音频方形频谱生成方法,能高效的快速生成音频的频谱,并以方形频谱的形式展现,动画效果顺滑,用户体验好,支持色彩的渐变,富于美感,对系统资源占用少。

为达到以上目的,本发明采取的技术方案是:

一种音频方形频谱生成方法,其特征在于,包括如下步骤:

步骤1,自定义控件kwaudiovisualizerview,其继承view控件;

步骤2,在自定义控件的构造函数中,设置画笔,用于绘制方形频谱;

步骤3,在自定义控件的构造函数中,设置绘制方形频谱区域;

步骤4,在自定义控件的构造函数中,确定单个方形频谱的宽高;

步骤5,定义handler变量,用于处理消息,用于循环绘制各单个方形频谱;

步骤6,当开始绘制的时候,在handler的消息处理回调中,获取播放器对象;

步骤7,如果获取播放器对象为空,则对消息做移除操作,不再绘制频谱;

如果获取播放器对象非空,则进行绘制频谱处理。

在上述技术方案的基础上,步骤3中,所述设置绘制方形频谱区域具体包括:

区域形状,默认为矩形,

区域坐标值,默认包括左上、左下、右上、右下四个矩形顶点坐标值。

在上述技术方案的基础上,步骤4中,所述确定单个方形频谱的宽高具体包括:

单个方形频谱的宽度,默认宽度值为dip2px(5),

单个方形频谱最大高度,默认最大高度值为dip2px(28)。

在上述技术方案的基础上,步骤7中,所述进行绘制频谱处理具体包括:

解析并获取当前的播放时间,当播放时间不为-1的时候,就执行view的invalidate进行重绘,在ondraw回调中绘制具体的方形频谱。

在上述技术方案的基础上,还包括:

步骤8,执行重绘之后,按照安卓系统的刷新频率间隔的给handler发送消息,handler再重复处理步骤5到步骤8,达到每隔16毫秒重新绘制的效果。

在上述技术方案的基础上,步骤8之后,还包括处理音频数据的如下步骤:

步骤9,获取歌曲播放的总时长;

步骤10,音频数组的每个值对应一个方形频谱,根据音频数组的数组长度和音频总时长,用获取的当前播放时间计算出当前是第几个方形频谱,保存到成员变量curplayinfo[0]中,在绘制的过程中会使用这个数值;

步骤11,计算在当前方形频谱中播放的比例,乘以方形频谱分配的像素值,就计算出了当前方形频谱中播放的宽度,单位是像素;

步骤12,绘制方形频谱。

在上述技术方案的基础上,所述音频为短音频,

所述短音频是指:音频时长在1到30秒内的音频。

在上述技术方案的基础上,短音频的来源是:

音频资源的精彩亮点进行抽取后形成的短音频,

音频资源进行精加工后形成的短音频,

音频资源进行取舍后形成的短音频,

用户交流互动时的语音进行录制形成的短音频,所述交流互动包括:话题讨论,广播节目播报,在线问答。

在上述技术方案的基础上,所述短音频包括:音频数据和文本数据,音频数据用于解析后通过播音设备呈现给用户,文本数据用于解析后通过显示设备呈现给用户。

本发明所述的音频方形频谱生成方法,能高效的快速生成音频的频谱,并以方形频谱的形式展现,动画效果顺滑,用户体验好,支持色彩的渐变,富于美感,对系统资源占用少。

附图说明

本发明有如下附图:

图1本发明的流程图。

图2展示图片示意图。

图3绘制效果示意图。

具体实施方式

以下结合附图对本发明作进一步详细说明。

本发明所述音频尤其适用于短音频,所述短音频是指:音频时长在1到30秒内的音频,优选音频时长在1到15秒,最优选音频时长在1到7秒。“短音频”合乎当今时代节奏,面对移动互联网用户需求与习惯,短音频更利于用户间的交流与分享。短音频的来源可以是:

音频资源的精彩亮点进行抽取后形成的短音频,

音频资源进行精加工后形成的短音频,

音频资源进行取舍后形成的短音频,

用户交流互动时的语音进行录制形成的短音频,所述交流互动包括:话题讨论,广播节目播报,在线问答。

更进一步,所述短音频包括:音频数据和文本数据,音频数据用于解析后通过播音设备呈现给用户,文本数据用于解析后通过显示设备呈现给用户。

如图1所示,本发明所述的音频方形频谱生成方法,包括如下步骤:

步骤1,自定义控件kwaudiovisualizerview,其继承view控件;

步骤2,在自定义控件的构造函数中,设置画笔,用于绘制方形频谱;

步骤3,在自定义控件的构造函数中,设置绘制方形频谱区域;

具体包括:

区域形状,默认为矩形,

区域坐标值,默认包括左上、左下、右上、右下四个矩形顶点坐标值;在绘制逻辑中,根据四个顶点坐标值形成频谱区域;

步骤4,在自定义控件的构造函数中,确定单个方形频谱的宽高;

具体包括:

单个方形频谱的宽度,默认宽度值为dip2px(5),

单个方形频谱最大高度,默认最大高度值为dip2px(28);

步骤5,定义handler变量,用于处理消息,用于循环绘制各单个方形频谱;

handler是android系统提供的一种机制,主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理,这种机制通常用来处理相对耗时比较长的操作;

步骤6,当开始绘制的时候,在handler的消息处理回调中,获取播放器对象;

开始时,handler会接收到android主线程发来的消息,消息其实就是一个通知或者一个事件,可以携带一些变量信息给消息接收方;例如:通过message.what=1类型的消息,以表明此message属于开始操作;

获取播放器对象可以用以下指令:

ijkmediaplayermmediaplayer

=bibiplayproxy.getins().getplayer();

ijkmediaplayer是媒体播放器类,用来播放音频、视频的第三方框架,bibiplayproxy.getins().getplayer()是代码中封装的获取播放器的工具类,这个不同的项目可以做适合自己的封装;

步骤7,如果获取播放器对象为空,则对消息做移除操作,不再绘制频谱;

如果获取播放器对象非空,则进行绘制频谱处理。

在上述技术方案的基础上,所述进行绘制频谱处理具体包括:

解析并获取当前的播放时间,当播放时间不为-1的时候,就执行view的invalidate进行重绘,在ondraw回调中绘制具体的方形频谱。

在上述技术方案的基础上,还包括:

步骤8,执行重绘之后,按照安卓系统的刷新频率间隔的给handler发送消息,handler再重复处理步骤5到步骤8,达到每隔16毫秒重新绘制的效果。

所述安卓系统的刷新频率为16毫秒,即16毫秒之后再给handler发送消息,这一间隔时间使人眼感觉不到卡顿。

例如:

sendemptymessagedelayed(11,16l);

就是利用android系统的sendemptymessagedelayed功能函数,向主线程发送一个消息,11是消息的代码,16l表示16毫秒。

在上述技术方案的基础上,步骤8之后,还包括处理音频数据的如下步骤:

步骤9,获取歌曲播放的总时长;

例如:

ijkmediaplayerplayer

=bibiplayproxy.getins().getplayer();

longduration=player.getduration();

if(duration>0){

maudioduration=duration/1000d;

}

其中,ijkmediaplayer是媒体播放器类,用来播放音频、视频的第三方框架,bibiplayproxy.getins().getplayer()是代码中封装的获取播放器的工具类,这个不同的项目可以做适合自己的封装,player.getduration()是获取播放器的总的播放时长,duration是毫秒,除以1000就得出单位是秒的时长;

步骤10,音频数组的每个值对应一个方形频谱,根据音频数组的数组长度和音频总时长,用获取的当前播放时间计算出当前是第几个方形频谱,保存到成员变量curplayinfo[0]中,在绘制的过程中会使用这个数值;

例如:

curplayinfo[0]=(int)(curposition*(mwaveformdata.length/(1000.0d*maudioduration)));

curplayinfo是保存播放信息的容器,curplayinfo[0]保存的是当前第一个方形频谱的数据,curposition是播放的当前时间,mwaveformdata是音频数组,保存了音频的数据,maudioduration是音频的总时长;

步骤11,计算在当前方形频谱中播放的比例,乘以方形频谱分配的像素值,就计算出了当前方形频谱中播放的宽度,单位是像素;

例如:

curplayinfo[1]=(int)(((curposition-d*curplayinfo[0])/d)*pixels_for_per_data_range);

curplayinfo是保存播放信息的容器,curplayinfo[1]保存的是在当前方形频谱中的宽度,单位是像素,curposition是当前播放的时间,d的当前播放的时间和音频总时长的比值,pixels_for_per_data_range是每个方形频谱的宽度,值为5dp;

步骤12,绘制方形频谱。

在上述技术方案的基础上,步骤12的具体步骤为:

步骤12.1,在handler的handlemessage中会调用view的invalide,使界面重绘,在view的ondraw回调中处理界面绘制逻辑,在ondraw回调种,获取控件kwaudiovisualizerview高度和宽度,计算出一半屏幕包含的方形频谱数据,之所以是一半屏幕,是因为设计中,在方形频谱移动到屏幕一半的时候,整体的方形频谱往屏幕左边移动,达到文中要实现的动画效果;

例如:

intwidgetwidth=getwidth()-getpaddingright()-getpaddingleft();//显示宽度

inthalfviewwidth=widgetwidth/2;

getwidth()能获取控件kwaudiovisualizerview的宽度,getpaddingleft()和getpaddingright()获取宽度的左右内边距,halfviewwidth是控件kwaudiovisualizerview相对于屏幕的中间的宽度;

步骤12.2,当开始播放的时候,绘制染色部分是从0开始的,当绘制染色的部分达到控件中间点的时候,绘制染色部分不动,也就是左半边绘制染色部分,右边绘制未播放的状态,

绘制未播放的状态的具体方式包括但不限于:展示一张图片,参见图2所示;

步骤12.3,当需要移动的条目数量小于音频数组的时候,循环绘制方形频谱,从左边开始,确定左边的绘制区域,右边就是左边的像素加上方形频谱宽度,底部是控件的最低端,高度是音频数据乘以一个像素的经验值28dp;

步骤12.4,经过步骤12.3,确定了绘制区域,就在view的画布上绘制矩形;移动的频谱数量自增,左边绘制的像素再增加一个方形频谱宽度;

例如:

canvas.drawrect(mtmprect,paint);

canvas是控件kwaudiovisualizerview的画布,drawrect是android系统提供的画布的api接口,用来绘制一个区域,mtmprect是确定的绘制的方形频谱区域,paint是画笔,执行这一行代码就可以绘制出一个方形频谱。

本发明的算法,如图3所示,可以实现以下效果:一开始播放的时候,方形频谱都是灰色的,播放过程中渐渐的覆盖上新的颜色,当渐变颜色到达中部的时候频谱向左滚动,左半边还是深色的,后半部是灰色的。在单个频谱上,绘制也是按照像素渐进绘制的,动画效果顺滑,用户体验好。

本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1