本发明涉及数据结构技术与音频处理技术领域,具体涉及一种获取音频数据的方法及系统。
背景技术:
目前,音频频谱图的生成都需要通过抓取音频解码器生成的PCM(脉冲编码调制)数据,提取的方法一般是通过消息队列、共享内存等方式进行传递,或者在解码线程加锁,以解决数据的生产者和消费者问题。
现在一些数据结构技术与音频处理技术领域的使用方法都需要解码线程做大量的操作,这样操作会影响解码速度导致播放异常,并且从用户的视觉上,现有的频谱图只是定时抽取部分数据进行处理,抓取过多的数据只是造成性能上的浪费。
功能的数据来源于音频PCM数据的提取,而PCM数据由由解码器线程生成并向应用层分发数据,解码器线程是音乐播放器优先级最高的线程之一,因此在解码器线程提取数据应该避免使用同步锁等系统内核级同步工具,且相关操作尽可能不影响解码线程正常工作,且频谱图的绘制是定时提取部分音频数据即可,不宜在内存中保存过多数据。
技术实现要素:
本发明的目的是解决现有技术中提取数据应该避免使用同步锁等系统内核级同步工具,且相关操作尽可能不影响解码线程正常工作;频谱图的绘制应是定时提取部分音频数据即可,不宜在内存中保存过多数据的问题。
为实现上述目的,一方面,本发明提供了一种获取音频数据的方法,该方法包括以下步骤:构建音频数据存储结构,初始化后生成音频数据存储数组,以及创建数据提取线程;当待解码的音频数据达到预设长度时则赋予解码音频数据唯一的ID值,并存储到音频数据存储数组中;通过数据提取线程对音频数据存储数组和解码音频数据进行数据提取线程处理,获得音频数据。
优选地,音频数据存储数组的大小为10。
优选地,当待解码的音频数据达到预设值长度时则赋予解码音频数据唯一的ID值,并存储到音频数据存储数组中的步骤中包括:当保存的解码音频数据达到预设值长度时则赋予解码音频数据唯一的ID值,若音频数据存储数组第一次满载时,则从音频数据存储数组中的第一数组开始更新储存解码音频数据直到音频数据存储数组第二次满载。
其中,预设长度的计算公式如下所示:预设长度=采样点数*音频位深度*音频通道数。
通过数据提取线程对音频数据存储数组和解码音频数据进行数据提取线程处理的步骤中包括:根据预设时间从音频数据存储数组中提取解码音频数据,按时间顺序进行读取。
另一方面,本发明提供了一种获取音频数据的系统,该系统包括:处理模块、存储模块和获取模块。
处理模块,用于构建音频数据存储结构,初始化后生成音频数据存储数组,以及创建数据提取线程。
存储模块,用于当待解码的音频数据达到预设长度时则赋予解码音频数据唯一的ID值,并存储到音频数据存储数组中。
获取模块,用于通过数据提取线程对音频数据存储数组和解码音频数据进行数据提取线程处理,获得音频数据。
优选地,处理模块中的音频数据存储数组的大小为10。
优选地,存储模块具体用于当保存的解码音频数据达到预设值长度时则赋予解码音频数据唯一的ID值,若音频数据存储数组第一次满载时,则从音频数据存储数组中的第一数组开始更新储存解码音频数据,直到音频数据存储数组第二次满载。
其中,存储模块具体用于,预设长度的计算公式如下所示:预设长度=采样点数*音频位深度*音频通道数。
此外,获取模块中提取线程处理包括:根据预设时间从音频数据存储数组中提取解码音频数据,按时间顺序进行读取。
本发明提供的一种获取音频数据的方法及系统,对解码器的工作影响可以忽略,且保存最新的数据,避免内存占用过大;同时,实现了无锁化的音频数据提取,且仅保留最新的音频PCM数据,具有占用内存少,效率高的特点。
附图说明
图1为本发明实施例提供的一种获取音频数据的方法流程图;
图2为本发明实施例提供的一种音频数据储存方法流程图;
图3为本发明实施例提供的一种音频数据提取方法流程图;
图4为本发明实施例提供的一种音频数据获取系统结构示意图。
具体实施方式
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
图1为本发明实施例提供的一种获取音频数据的方法流程图。如图1所示,该方法包括以下步骤:
步骤S101:构建音频数据存储结构,初始化后生成音频数据存储数组,以及创建数据提取线程。
优选地,音频数据存储数组的大小为10。
例如,定义一个音频数据存储结构,初始化生成固定大小(优选值为10)的音频数据存储数组,并创建数据提取线程。
步骤S102:当待解码的音频数据达到预设长度时则赋予解码音频数据唯一的ID值,并存储到音频数据存储数组中。
具体地,当待解码的音频数据达到预设值长度时则赋予解码音频数据唯一的ID值,并存储到音频数据存储数组中的步骤中包括:当保存的解码音频数据达到预设值长度时则赋予解码音频数据唯一的ID值,若音频数据存储数组第一次满载时,则从音频数据存储数组中的第一数组开始更新储存解码音频数据,直到音频数据存储数组第二次满载。
其中,预设长度的计算公式如下所示:预设长度=采样点数*音频位深度*音频通道数。
例如,当保存数据中的待解码的音频数据达到预设长度(其中,预设长度=采样点数*音频位深*音频通道数),则赋予一个惟一的ID值,按序存储到音频数据存储数组中,因音频数据存储数组存储容量为固定大小10,若音频数据存储数组10的位置被填满,再次存储的数据的ID值则覆盖原有音频数据存储数组0的位置的ID值并保存到音频数据存储数组0的位置,即循环写入,因此保证音频数据存储数组中存储的是最新数据。
通过数据提取线程对音频数据存储数组和解码音频数据进行数据提取线程处理,获得音频数据。
具体地,通过数据提取线程对音频数据存储数组和解码音频数据进行数据提取线程处理的步骤中包括:根据预设时间从所述音频数据存储数组中提取所述解码音频数据,按时间顺序进行读取。
例如,定时器定时(根据设备的性能指定时长,例如100毫秒)从数组中提取数据,按序读取,若读取到数组的末尾,则再从数组的头部开始读取,即循环读取。
以上操作不使用任何系统内核组线程同步工具,均使用原子操作索引的方式进行。在进行提取操作时判断是否正在保存数据,若正在保存则进行相应的延迟,保存时判断是否正在提取,若正在提取扔掉数据即可。
图2为本发明实施例提供的一种音频数据储存方法流程图。如图2所示,
步骤S201:获取数据,准备存储:当保存数据中的待解码的音频数据达到预设长度(其中,预设长度=采样点数*音频位深*音频通道数),则赋予一个惟一的ID值,按序存储到音频数据存储数组中。
步骤S202:判断非读取数据状态,若满足此状态则不保存;若满足此状态则执行步骤S203。
步骤S203:判断数组状态,若数组没有写满则保存到索引到对应的空项中。
例如,音频数据存储数组存储容量为固定大小10,若音频数据存储数组10的位置没有被填满,则直接索引音频数据存储数组5的位置存储。
若数组被写满则索引加1并保存到相应项,即循环写入。
例如,若音频数据存储数组10的位置被填满,则再次存储的数据的ID值则覆盖原有音频数据存储数组0的位置的ID值并保存到音频数据存储数组0的位置,即循环写入,因此保证音频数据存储数组中存储的是最新数据。
图3为本发明实施例提供的一种音频数据提取方法流程图。如图3所示,
步骤S301:定时器定时读取数据。
步骤S302:判断是否为写入数据状态,若不是非写入状态则根据设备的性能指定时长调整定时器。
若是非写入数据状态,则执行步骤S303。
例如,定时器定时(根据设备的性能指定时长,例如100毫秒)从数组中提取数据,按序读取。
步骤S303:判断是否为读取到音频数据存储数组末尾,若不是读取到音频数据存储数组末尾,则读取索引值对应的项。
若是读取到音频数据存储数组末尾,则索引加1并读取到对应的项。
例如,读取到数组的末尾,则再从数组的头部开始读取,即循环读取。
图4为本发明实施例提供的一种音频数据获取系统结构示意图。如图4所示,该系统包括:处理模块401、存储模块402和获取模块403。
处理模块401,用于构建音频数据存储结构,初始化后生成音频数据存储数组,以及创建数据提取线程。
优选地,处理模块401中的音频数据存储数组的大小为10。
存储模块402,用于当待解码的音频数据达到预设长度时则赋予解码音频数据唯一的ID值,并存储到音频数据存储数组中。
具体地,存储模块402具体用于当保存的解码音频数据达到预设值长度时则赋予解码音频数据唯一的ID值,若音频数据存储数组第一次满载时,则从音频数据存储数组中的第一数组开始更新储存解码音频数据直到音频数据存储数组第二次满载。
具体地,存储模块402具体用于,预设长度的计算公式如下所示:预设长度=采样点数*音频位深度*音频通道数。
获取模块403,用于通过数据提取线程对音频数据存储数组和解码音频数据进行数据提取线程处理,获得音频数据。
具体地,获取模块403中提取线程处理包括:根据预设时间从音频数据存储数组中提取解码音频数据,按时间顺序进行读取。
本发明提供的一种获取音频数据的方法及系统,对解码器的工作影响可以忽略,且保存最新的数据,避免内存占用过大;同时,实现了无锁化的音频数据提取,且仅保留最新的音频PCM数据,具有占用内存少,效率高的特点。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。