# ACA服务设计说明 ## ACA服务功能 - 计算`静音`、`过载`、`反相`、`噪音`、`一致性`状态 - 实时发送音量包数据,给客户端绘制波形 - 提供RTP监听服务,客户端连接后可以实时听正在录音的内容 - 报警功能,报警时录制报警音频,写入报警信息到数据库中 ## 程序启动 1. 先启动服务,获取系统声卡信息 2. 打开设置动态库,设置创建对比项,选择声卡通道 3. 服务读取到对比项信息,开始创建对比项线程,开始运行 ## ACA服务数据流转 - 服务整体分为两个部分,`数据采集`和`数据计算`部分,数据采集是`录音线程类`,录音并做初步处理,数据计算是`计算线程类`,创建对比项线程后,由对比项线程创建和管理各个计算线程类。 - 对比项线程汇集所有的计算结果后,取出实时音量,拼接成音量包发送到MQTT中 - 对比项管理线程发送开启的对比项信息到MQTT中,设置消息保留 - RTP服务监听客户端消息,发送实时音频数据 ### 录音线程 - 录音线程和声卡录音通道一一对应,一个录音通道会开启6个线程,对原始数据进行处理 - 录音间隔33ms是为了对应计算音量值所需的数据大小,1秒大概33个音量值 |线程类|功能| |---|---| |RecordThread|录制原始音频的线程,33ms获取一次| |AssignSrcDataThread|分派数据线程,这个线程可以合并到录音线程中,分派数据只需要几百us| |CreateWAVThread|创建一致性对比需要的wav文件,分离左右声道数据给噪音检测线程| |CreateRecordFileThread|录制长音频文件,录制报警文件| |CreateDBThread|计算1秒的音量包,给计算静音、过载、反相的线程使用,计算实时音量包给对比项线程使用,发送实时音量包| |RTPOneRoadThread|客户端登陆后,实时发送原始音频数据给客户端| ### 计算线程 - 计算线程和对比项相关联,一个对比项会创建若干计算线程,对比项线程销毁时,也会将计算线程销毁 - 一个对比项对应的三种计算类并不仅仅是三个线程,这些计算线程和对比项通道相关 - 计算线程在计算出报警后,将开启`CreateRecordFileThread`的报警录音,报警结束后通知`CreateRecordFileThread`线程结束录音,报警结束后通过`ThreadWriteDBManager`线程将报警信息写入数据库 |线程类|功能| |---|---| |CompareItemThread|对比项线程类,从这个类中集合`静音`、`过载`、`反相`、`噪音`、`一致性`检测的结果和音量数据,组合成音量包发送到MQTT| |CalculateDBThread|计算`静音`、`过载`、`反相`的报警| |ConsistencyCompareThread|计算`一致性`数据| |NoiseDetectThread|计算`噪音`报警| ### RTP服务 - RTP服务提供实时音频数据发送功能,客户端发送登录请求,RTP服务将客户端信息发送给`RTPOneRoadThread`,`RTPOneRoadThread`接收到客户端信息后开始接收分派数据线程发送的数据,然后通过UDP将音频数据发送给客户端 ### 其他线程功能 - |线程功能类|说明| |---|---| |ThreadManager|录音线程管理类| |ThreadCompareItemManager|对比项管理线程类| |ThreadWriteDBManager|写数据库线程类| - 录音线程管理线程类`ThreadManager`,录音线程的创建和销毁由这个线程管理,对比项线程通过这个线程开始录音通道 - 比项管理线程类`ThreadCompareItemManager`,定时获取数据库中对比项信息,管理对比项的开启和销毁,同时向MQTT中发送对比项信息 - 写数据库线程类`ThreadWriteDBManager`,所有的报警信息,录音文件信息都由这个线程写入数据库,单独搞这一个线程为了防止网络状态差,会阻塞计算线程。这个线程还有一个功能是根据设置的时间定时清理数据库中的日志和录音文件,报警文件