最近在做音视频相关代码,发现网上关于音频处理的大同小异,相关处理的细节,不够详细,博主过坑在这里一一详述,希望对读者有一定的启发。
// 设置采样格式
QAudioFormat audioFormat;
audioFormat.setSampleRate(8000);
audioFormat.setChannelCount(1);
audioFormat.setSampleSize(16);
audioFormat.setCodec("audio/pcm");
audioFormat.setByteOrder(QAudioFormat::LittleEndian);
audioFormat.setSampleType(QAudioFormat::SignedInt); // 16-bit signed integer
// 检查默认输入设备
QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(audioFormat)) {
audioFormat = info.nearestFormat(audioFormat);
}
//检查默认的输出设备
info = QAudioDeviceInfo::defaultOutputDevice();
if (!info.isFormatSupported(audioFormat)) {
audioFormat = info.nearestFormat(audioFormat);
}
// 创建音频输入输出对象
audioInput = new QAudioInput(audioFormat, this);
audioInput->setBufferSize(xxxxx);//audioInput不够大导致后面的数据会冲掉前面的数据导致音频数据错误,音频卡顿重复播放,根据编码需要设定
// //将麦克风的音频数据传输到输入设备
// streamIn = audioInput->start();
// //当输入设备检测到数据时,调用槽函数slogReadDatabugo
// connect(streamIn, SIGNAL(readyRead()), SLOT(slogReadData()));
audioOutput = new QAudioOutput(audioFormat, this);
//将音频数据传输到输出设备,再由输出设备写入到扬声器
streamOut = audioOutput->start();
往往很多人对于音频的处理直接在初始化时候将音频的输入设备直接start,这会导致在程序启动直接开始读取数据,如果说设备对讲不是一启动设备就开启对讲会造成stream堆积大量的录音设备造成音频对讲卡顿或者对讲不同步。
2.第二个坑就是关于 audioInput->setBufferSize();输入音频数据的大小设置,audioInput不够大导致后面的数据会冲掉前面的数据导致音频数据错误,音频卡顿重复播放;举个例子,数数在1中间会卡顿然后重复1,产生拖音。具体的处理方法如下:
void MyTalkAudio::slogReadData()
{
// 需要一个标志位触发
streamIn = audioInput->start(); // 开始音频输入流
}
关于编解码部分采用G7xx 系列,以上仅供参考,如有疑问可私信交流。