一、场景
一个网络音频采集场景如下:
数据发送端:嵌入式设备按照16kHz 16Bit连续不断采集音频数据,通过Socket进行发送
数据接受端:QT上位机开一个tcpserver,数据readReady后由QByteArray进行追加,音频波形显示开了一个定时器,每100ms去取QByteArray指定长度(16K*0.1*2),并remove该数据。
打印结果发现,QByteArray的数据越来越多,说明接受数据和取数据的速度没匹配。
日志:
二、分析
数据发送端是用的实时系统,音频采集的数据发送频率不会出现问题,那应该是QT上位机定时器的精度不到,定时器出现误差才会出现FIFO不断增长。
经过了解,QTimer的精度确实不太够,默认构造为Qt::CoarseTimer,粗略定时精度在正负5%。另一方面,windows不是实时系统,时间片轮转调度也会导致定时器的误差。
提高QTimer的精度,可以使用setTimerType(Qt::PreciseTimer),性能会好些。