专利名称:一种音频捕获中的无缝平滑方法
技术领域:
本发明涉及音频捕获领域,尤其涉及音频捕获中的无缝平滑方法。
背景技术:
利用计算机声卡进行音频捕获的过程中,通常需要根据捕获时间的长短,事先在内存中分配一块连续的存储空间,用以保存被捕获的音频数据。这种方式虽然非常简单、直观,但是对于那些事先无法估计出捕获时间的情况来说,分配多大的内存空间就成为一个棘手的问题。如果内存空间分配小了,就会造成数据丢失和溢出;如果分配的空间过大,又会造成对宝贵的存储资源的浪费。即便是在有些情况下,可以事先准确计算出特定时间内,音频捕获所需要的存储空间大小,但是如果捕获的时间比较漫长,这种原始的声音数据也会占用大量的系统资源。原始的数字音频数据质量主要由采样率、声道数、单个采样点的位数决定。
为了解决根据时间长度分配存储空间的问题,一种改进的方案是将捕获的音频数据写入像文件缓冲区这样的可动态改变大小的存储空间里。文件缓冲区被创建之后,会自动根据写入数据的多少,自动扩展其大小。但是利用文件缓冲区存储捕获的音频数据时,也有其不尽如人意的地方。首先,文件缓冲区在存储空间里不是按照连续的地址空间来分配,这就意味着无法通过简单、有效的方式直接顺序访问缓冲区地址。其次,文件缓冲区的大小仍然受系统资源的约束,换句话说,它只能用来保存有限的数据,无法真正做到无限时间的音频捕获。
另外一种改进方案采用小容量的环形内存访问方式即可以解决根据时间长度分配存储空间的问题,也能够保证任意时间长度音频捕获的需要。从概念上讲,环形缓冲区并不是真正以环形地址序列分配的,它只是在连续访问缓冲区的时候,一旦指针到达了缓冲区的结尾处,它会立即从头开始(见图1)。如果要往环形缓冲区中动态地写入数据,也应该按同样的回绕方式写入数据。环形缓冲区虽然可以用来解决一次性静态分配存储空间的问题,但是它也同时带来了新的隐患。由于当指针到达了缓冲区的尾地址时,它会立即从返回到首地址,那么在音频捕获的过程中,如果先前缓冲区首地址的数据没有被及时处理,那么这些数据就会被覆盖,从而造成了数据的丢失。比较典型的音频捕获并行方式,是在指针到达缓冲区特定地址的时候,向系统发送消息,通知音频读取过程开始拷贝数据。由于捕获和读取过程是并行执行的,相互之间并不等待,因此就有很容易造成音频读取过程的数据撕裂。例如在指针到达缓冲区的尾地址时,系统收到由捕获过程发送而来的消息,便立即启动音频读取过程开始拷贝数据,但是由于此时的捕获过程仍然会将数据源源不断地向缓冲区写入,而音频读取过程又不能保证在一次CPU时间片里可以完成读取任务,于是就容易造成一部分未读取的音频数据被捕获过程覆盖掉的情况。这时候,音频数据将是不连续的了,也就是被撕裂了。
发明内容
为了解决现有技术中的问题和不足,本发明的目的在于提供了一种能对任意时间长度、任意参数音频进行实时捕获,同时又能够消除音频数据记录和访问过程中的撕裂问题的无缝平滑方法。它为各种实时音频处理系统提供了完整、高效、低成本的解决方案。
为了实现上述发明目的,本发明的技术方案以如下方式实现一种音频捕获中的无缝平滑方法,其步骤为1)将音频数据写入指针和音频数据读取指针指向音频数据缓冲区的首地址,同时在音频数据缓冲区中设置N个消息触发点将音频数据缓冲区分成N+1个子音频数据缓冲区,并且保证在任意相邻的两个子音频数据缓冲区进行音频捕获的时间大于进行音频读取的时间;2)启动音频捕获过程;3)判断音频数据写入指针是否到达消息触发点,如果到达,则在进行音频捕获的同时发送通知消息给系统并执行步骤4),如果没有到达,继续进行音频捕获;4)系统接收到通知消息后,启动音频读取过程;5)如果此时的消息触发点小于N,从音频数据读取指针的当前位置开始,以发送的消息触发点位置为结束读取这段缓冲区里的数据,并将音频数据读取指针指向消息触发点的下一个地址并执行步骤6),如果此时的消息触发点大于N,从音频数据读取指针的当前位置开始,以音频数据写入指针的位置为结束读取这段缓冲区里的数据,并将音频数据读取指针指向消息触发点的下一个地址并执行步骤7);6)结束音频读取过程并返回步骤3);7)结束音频读取过程并释放系统资源。
上述步骤1)所述的音频数据缓冲区为循环多重缓冲(LoopingMulti Buffer,简称LMB)。
上述步骤1)所述的N≥1。
上述步骤1)所述的N个消息触发点均匀设置于所述音频数据缓冲区内,所述子音频数据缓冲区的大小相同。
上述步骤3)所述的不同的消息触发点的对应不同的通知消息。
上述步骤3)之后还可以包括以下步骤1)如果此时音品捕获过程被终止,主动向系统发出音频捕获过程被终止消息;2)系统接收到终止消息后,启动音频读取过程,读取音频数据读取指针所指的地址到音频数据写入指针所指的地址之间的缓冲区里的数据。
本发明音频捕获过程先于读取过程开始工作。初始时,音频数据写入指针和音频数据读取指针都指向音频数据缓冲区的首地址。当音频数据写入指针到达消息通知触发点时,向系统发送消息通知。系统在接收到此消息后即激活音频读取过程。音频读取过程不依赖于写入指针的当前位置,而是以读取指针的当前位置为开始,以发送消息的触发点位置为结束,读取这段缓冲区里的数据,并将读取指针指向触发点的下一个地址。此时,写入指针还未到达下一个消息通知触发点,因此不会对音频读取过程产生干扰。等到下一个消息被触发之后,音频读取过程接着先前的读取指针位置开始,将直至当前触发点位置的数据读出。而前后顺序读出的数据将是完整连续的,之间没有任何的撕裂现象。另外,本发明采用的是循环多重缓冲作为音频数据缓冲区。LMB是基于环形内存访问方式的小容量存储空间,该空间是一块地址连续的内存区域,在这段地址连续的内存区域内,预先均匀设定若干消息通知触发点,LMB可以由音频数据写入指针和音频数据读取指针同时访问,其中音频捕获过程控制数据写入指针,音频读取过程控制数据读取指针。另外,当音频捕获过程被终止的时候,数据写入指针极有可能会没有到达设定了消息的触发点,也就是说没有消息会发向系统,通知音频读取过程将最后的数据读取出来。因此,本发明与同类型技术相比,具有以下优势1、降低了对存储空间等系统资源的占用率,提升了音频捕获技术的应用范围。
2、取消了音频捕获的时间限制,理论上支持无限时间长度的音频捕获。
3、音频数据读取延时短,满足各种实时音频数据处理系统的需要。
4、捕获的音频数据完整、平滑,没有任何撕裂和丢失现象。
图1为环形缓冲数据存储区示意图;图2为本发明的流程图;图3为本发明音频数据缓冲区示意图;图4为设置了若干消息出发点的环形缓冲数据存储区示意图。
下面针对附图和本发明的具体实施方式
对本发明进行详细地说明。
参看图2和图3,一种音频捕获中的无缝平滑方法,其步骤为1)将音频数据写入指针和音频数据读取指针指向音频数据缓冲区的首地址,同时在音频数据缓冲区中设置N个消息触发点将音频数据缓冲区分成N+1个子音频数据缓冲区,并且保证在任意相邻的两个子音频数据缓冲区进行音频捕获的时间大于进行音频读取的时间;2)启动音频捕获过程;3)判断音频数据写入指针是否到达消息触发点,如果到达,则在进行音频捕获的同时发送通知消息给系统并执行步骤4),如果没有到达,继续进行音频捕获;4)系统接收到通知消息后,启动音频读取过程;5)如果此时的消息触发点小于N,从音频数据读取指针的当前位置开始,以发送的消息触发点位置为结束读取这段缓冲区里的数据,并将音频数据读取指针指向消息触发点的下一个地址并执行步骤6),如果此时的消息触发点大于N,从音频数据读取指针的当前位置开始,以音频数据写入指针的位置为结束读取这段缓冲区里的数据,并将音频数据读取指针指向消息触发点的下一个地址并执行步骤7);6)结束音频读取过程并返回步骤3);7)结束音频读取过程并释放系统资源。
本发明采用的是循环多重缓冲作为音频数据缓冲区。LMB是基于环形内存访问方式的小容量存储空间,该空间是一块地址连续的内存区域,在这段地址连续的内存区域内,预先均匀设定若干消息通知触发点,如图2所示。从抽象的角度来看,这些消息通知触发点将这块连续的内存区域划分为若干的Buffer(子音频数据缓冲区),于是就形成了具有环形访问方式的多缓冲内存区域。LMB可以由音频数据写入指针和音频数据读取指针同时访问,其中音频捕获过程控制数据写入指针,音频读取过程控制数据读取指针。
为了解决音频捕获过程和读取过程在并行执行的过程中造成的数据撕裂问题。在LMB中规定1、从音频数据写入指针所指的地址到音频数据读取指针所指的地址之间的缓冲区是能够安全写入的。
2、从音频数据读取指针所指的地址到音频数据写入指针所指的地址之间的缓冲区是能够安全读取的。
3、任意两个相邻的消息通知触发点之间的缓冲区的尺寸必须足够大,以保证音频捕获过程在填充满一个子音频缓冲区之前,音频读取过程已经完成了对上一个子音频缓冲区音频数据的读取工作。由于音频捕获过程写入的速度主要受音频参数的影响,而音频读取过程的读取速度主要取决于系统的硬件环境,所以抽象缓冲区的尺寸到底需要设置为多大才能保证并行过程的安全,必须依据软件所支持的最低硬件配置来决定。
上述步骤1)所述的N≥1。
上述步骤1)所述的N个消息触发点均匀设置于所述音频数据缓冲区内,所述子音频数据缓冲区的大小相同。
为了准确定位当前消息通知触发点的位置,需要对不同的触发点对应不同的消息标记。这样在音频读取过程中,只需判断当前的消息标记,就可以准确定位出当前是哪个触发点的消息被触发。
在这里,还有一个必须要考虑的问题是,当音频捕获过程被终止的时候,数据写入指针极有可能会没有到达设定了消息的触发点,也就是说没有消息会发向系统,通知音频读取过程将最后的数据读取出来。这就意味着,如果不采用特殊的机制,最后的这一部分音频数据就会丢失。因此在音频捕获过程被终止的时候,要主动向系统发出音频捕获过程被终止的消息,并激活音频读取过程。音频读取过程在判断出这一特殊消息之后,将读取音频数据读取指针所指的地址到音频数据写入指针所指的地址之间的缓冲区里的数据,从而完整地获取了所有的音频数据。因而,上述步骤3)之后还包括以下步骤1)如果此时音品捕获过程被终止,主动向系统发出音频捕获过程被终止消息;2)系统接收到终止消息后,启动音频读取过程,读取音频数据读取指针所指的地址到音频数据写入指针所指的地址之间的缓冲区里的数据。
权利要求
1.一种音频捕获中的无缝平滑方法,其步骤为1)将音频数据写入指针和音频数据读取指针指向音频数据缓冲区的首地址,同时在音频数据缓冲区中设置N个消息触发点将音频数据缓冲区分成N+1个子音频数据缓冲区,并且保证在任意相邻的两个子音频数据缓冲区进行音频捕获的时间大于进行音频读取的时间;2)启动音频捕获过程;3)判断音频数据写入指针是否到达消息触发点,如果到达,则在进行音频捕获的同时发送通知消息给系统并执行步骤4),如果没有到达,继续进行音频捕获;4)系统接收到通知消息后,启动音频读取过程;5)如果此时的消息触发点小于N,从音频数据读取指针的当前位置开始,以发送的消息触发点位置为结束读取这段缓冲区里的数据,并将音频数据读取指针指向消息触发点的下一个地址并执行步骤6),如果此时的消息触发点大于N,从音频数据读取指针的当前位置开始,以音频数据写入指针的位置为结束读取这段缓冲区里的数据,并将音频数据读取指针指向消息触发点的下一个地址并执行步骤7);6)结束音频读取过程并返回步骤3);7)结束音频读取过程并释放系统资源。
2.按照权利要求1所述的音频捕获中的无缝平滑方法,其特征在于,所述步骤1)所述的音频数据缓冲区为循环多重缓冲。
3.按照权利要求1所述的音频捕获中的无缝平滑方法,其特征在于,所述步骤1)所述的N≥1。
4.按照权利要求3所述的音频捕获中的无缝平滑方法,其特征在于,所述步骤1)所述的N个消息触发点均匀设置于所述音频数据缓冲区内,所述子音频数据缓冲区的大小相同。
5.按照权利要求1所述的音频捕获中的无缝平滑方法,其特征在于,所述步骤3)所述的不同的消息触发点的对应不同的通知消息。
6.按照权利要求1所述的音频捕获中的无缝平滑方法,其特征在于,所述步骤3)之后还包括以下步骤1)如果此时音品捕获过程被终止,主动向系统发出音频捕获过程被终止消息;2)系统接收到终止消息后,启动音频读取过程,读取音频数据读取指针所指的地址到音频数据写入指针所指的地址之间的缓冲区里的数据。
全文摘要
本发明公开了一种音频捕获中的无缝平滑方法,属于音频捕获领域。本发明步骤为1)将音频数据写入指针和音频数据读取指针指向首地址,同时设置N个消息触发点;2)启动音频捕获过程;3)判断写入指针是否到达消息触发点,如果到达,音频捕获的同时发送通知消息给系统并执行步骤4);4)系统接收到通知消息后,启动音频读取过程;5)如果此时的消息触发点小于N,读取特定缓冲区内的数据并按照规定设置读取指针并执行步骤6),如果此时的消息触发点大于N,读取特定缓冲区内的数据并按照规定设置读取指针并执行步骤7);6)结束音频读取过程并返回步骤3);7)结束音频读取过程并释放系统资源。
文档编号G06F3/16GK1696891SQ20041003782
公开日2005年11月16日 申请日期2004年5月11日 优先权日2004年5月11日
发明者付群, 施健标, 杨劲松, 焉勇 申请人:北京中星微电子有限公司