当需要通过网络或者其他间隔一定时间 接收(写) 音频数据,然后在往QAudioOutput写数据的时候,可能会出现无规律的变音或者不清晰的情况,当直接通过读取文件的方式写就没有问题,那么这可能跟我遇到的问题是一样的。
出现这个原因的问题就是在给QAudioOutput写数据的时候,bytesFree获取到空闲字节为0,这个时候写数据的话,就会出现变音或者不清晰,这个时候就要把数据缓存起来,等到bytesFree不是0的时候,再根据缓存的长度和bytesFree去决定写多长的数据。
以下是关于使用QAudioOutput时需要注意的一些事:
- 通过打印bytesFree可以知道,QAudioOutput每次都会拿setBufferSize五分之一的数据,可以通过periodSize获取到每次需要的数据长度,也就是setBufferSize / 5 = periodSize,比如setBufferSize设置10000字节,那每次都会拿2000字节,所以为了完整性,最好每次都写入periodSize倍数字节的数据。
- 如何setBufferSize设置过小,可能也会出现变音或者不清晰。所以setBufferSize时,最小得是你每次写得字节数 * 5 * 2,最好是每次写得字节数*5的倍数(不小于10)。
- 通过上面两点的处理方式后,最后出的声音会有延迟,比如原本每10ms毫秒写一个数据的,setBufferSize是10ms数据长度*10,periodSize就10ms * 10 / 5数据的长度,声音就会再收到第二次数据的时候出来,也就是延迟10ms才出来。如果每1ms毫秒写一个数据的,setBufferSize是1ms数据 *10,那声音就会延迟1ms才出来。所以要根据自己的实际需求来setBufferSize。