声音三要素: 采样率, 量化精度, 声道
通常我们用一位二进制表示两种状态, 如1表示高电平, 0表示低电平。在音频领域里,如只用一位二进制表示声音,那么只能表示发声和不发声两种状态(蜂鸣器)。
如果使用过音频分析软件会发现,声音是由连续的不规则的波形来表示, 根本不可能用一位二进制数据表示一个人发出的声音。但可以用多位二进制的数据来表示(音频里通常是用8位或者16位). 如用8位数据表示 0 -- 20KHz: 0xff可表示20KHz, 0xfe表示19.92KHz, 0xfc表示19.84KHz ....
把声音经过测量转换成多位的二进制数据就是在计算机系统里存储的原始声音数据(也叫pcm数据), 数据的位数就是量化精度。通常是8位/16位
采样率就是声音转换成二进制数据的频率,常用的采样率有: 8000, 11025, 22050, 44100, 48000
从声音的还原角度来说采样率越高,质量就越好。
声音就是表示声音源的通道。嵌入式系统里通常是单声道/双声道.
CD唱片通常是发烧友所用的,片中没有图像。而一张蝶片有650M左右,为什么只有十多首歌曲?
算一算: 高保真肯定是用最高的采样率48000, 量化精度16位(2字节), 立体声2声道. 一首歌通常200秒
48000 * 2 * 2 * 200 = 38400000字节, 大概38M一首歌曲
在QT里用QAudioDeviceInfo类获取声卡设备的信息。
QAudioInput类操作声卡的录音
QAudioOutput类操作声卡的放音
QAudioFormat类对象用于配置声卡所用的声音三要素。
一. 录音操作
1. 配置声音三要素
QAudioFormat format;
format.setSampleRate(48000); //采样率
format.setChannelCount(2); //声道
format.setSampleSize(16); //量化精度
format.setCodec("audio/pcm"); // 目前只支持pcm数据
2. 创建QAudioInput对象, 并传递要配置的声音参数
QAudioInput *ainput = new QAudioInput(format); //这里是使用默认的录音设备,也可以使用另一重载的构造函数指定使用的录音设备。
3. 让录音设备开始录音.
QIODevice *dev = ainput->start(); // 调用start函数后, 返回QIODevice对象的地址。我们就通过此对象接收录音设备的数据。
//当录音设备数据准备好时,dev指向的对象会发出readyRead信号,只需要连接此信号的槽函数里调用read函数接收即可
connect(dev, SIGNAL(readyRead()), this, SLOT(slot_read()));
void Widget::slot_read()
{
QIODevice *dev = qobject_cast<QIODevice *>(sender());
QByteArray ba;
ba = dev->readAll();
//可以把ba里的数据存放到一个文件里,如"/test.raw". 完毕后, 可用"aplay /test.raw -f S16_LE -r 48000 -c 2"来测试
}
二. 放音(过程与录音差不多)
1. 配置声音三要素
QAudioFormat format;
format.setSampleRate(48000); //采样率
format.setChannelCount(2); //声道
format.setSampleSize(16); //量化精度
format.setCodec("audio/pcm"); // 目前只支持pcm数据
2. 创建QAudioOutput对象, 并传递要配置的声音参数
QAudioOutput *aoutput = new QAudioOutput(format); //这里是使用默认的音频设备,也可以使用另一重载的构造函数指定使用的音频设备。
3. 让音频设备开始放音.
QIODevice *dev = aoutput->start(); // 调用start函数后, 返回QIODevice对象的地址。我们就通过此对象的write函数把声音数据交给声卡发声。