对于音频我们在使用的过程中一般是录制音频、播放音频。针对这两个需求介绍Qt中音频的使用。
Qt中音频的录制
步骤:
1、获取系统中的音频设备。
2、创建QAudioRecorder对象,指定使用的音频设备,通过QAudioRecorder的setAudioInput函数设置。
3、设置音频的保存位置,通过QAudioRecorder对象的setOutputLocation函数设置。
4、设置保存的音频格式,通过QAudioRecorder对象的setAudioSettings函数设置,设置参数为QAudioEncoderSettings。
5、设置保存音频的容器格式,通过QAudioRecorder对象的setContainerFormat。
6、以上参数设置完成之后就可以QAudioRecorder对象调用record开始录制了,如果不设置相关才是,会使用系统默认的参数。
7、AudioRecorder对象调用stop()结束录制。
8、AudioRecorder对象调用pause()暂停录制。
代码如下:
c++
QList<QAudioDeviceInfo> audioDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);//获取音频的输入设备
foreach (QAudioDeviceInfo device, audioDevices) {
ui->comboBox_sound->addItem(device.deviceName());
}
......
m_audioRecorder = new QAudioRecorder(this);
QString datatime = QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss");
m_audioName = QString("%2/audio/%3").arg(savePath).arg(datatime);
m_audioRecorder->setOutputLocation(QUrl::fromLocalFile(m_audioName));
m_audioRecorder->setAudioInput(audioDeviceName);
QAudioEncoderSettings set;
set.setCodec("audio/wav"); // 这些是QAudioRecorder是设置,见名思意
set.setQuality(QMultimedia::EncodingQuality::HighQuality);
set.setEncodingMode(QMultimedia::ConstantQualityEncoding);
m_audioRecorder->setContainerFormat("audio/wav"); // 设置容器格式
m_audioRecorder->setAudioSettings(set);
m_audioRecorder->record();//开始录制
......
m_audioRecorder->pause();//暂停录制
......
m_audioRecorder->stop();//结束录制
以上可以完成最基本的音频录制,但是如果想使用更高端的录制,例如在录制的时候显示音频的想干信息。要想实现以上描述,需要使用Qt提供的QAudioProbe类来监控音频数据。
实现步骤如下:
1、创建QAudioProbe对象。
2、QAudioProbe对象通过调用setSource函数设置监控对象,传入参数为AudioRecorder对象。这里QAudioProbe对象监控的就是AudioRecorder对象对象输入的音频。
3、实现QAudioProbe::audioBufferProbed信号槽函数,这个信号是当在媒体服务中处理音频缓冲器时发出该。信号会传递一个QAudioBuffer 格式的音频数据。
4、实现槽函数接收QAudioBuffer 类型的数据,之后通过对接收到数据的计算实现频谱或者其他的显示。
代码如下:
c++
m_audioRecordProbe = new QAudioProbe(this);
m_audioRecorder = new QAudioRecorder(this);
//显示
m_audioRecordProbe->setSource(m_audioRecorder); // 指定声源
connect(m_audioProbe, &QAudioProbe::audioBufferProbed, this,[=](const QAudioBuffer &buffer){
emit audioProcessBuff(buffer);
});
Qt中音频的播放
步骤:
1、创建一个QMediaPlayer对象。
2、创建QMediaPlaylist对象。
3、通过QMediaPlaylist对象的setPlaybackMode函数创建列表的循环模式。
Constant | Value | Description |
---|---|---|
QMediaPlaylist::CurrentItemOnce |
0 |
当前项目只播放一次。 |
QMediaPlaylist::CurrentItemInLoop |
1 |
当前项目在循环中重复播放 |
QMediaPlaylist::Sequential |
2 |
播放从当前开始,在每个连续项目中移动,直到到达最后一个项目,然后停止。当前正在播放上一个项目时,下一个项目为空项目。 |
QMediaPlaylist::Loop |
3 |
播放在最后一个项目播放完毕后的第一个项目处重新开始。 |
QMediaPlaylist::Random |
4 |
按随机顺序播放项目 |
4、 QMediaPlayer对象通过函数setPlaylist设置播放列表,参数为QMediaPlaylist对象。
5、向播放列表中添加需要播放的音频,通过QMediaPlaylist对象addMedia函数添加音频列表。
6、在音频列表中选择需要播放的音频,使用QMediaPlaylist对象的setCurrentIndex函数,参数为音频标号。
7、QMediaPlayer对象调用play函数播放音频。
8、QMediaPlayer对象调用pause函数暂停播放音频。
9、QMediaPlayer对象调用stop函数停止播放音频。
代码如下:
c++
m_mediaPlayer = new QMediaPlayer(this);
m_mediaPlaylist = new QMediaPlaylist(this);
m_mediaPlaylist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
m_mediaPlayer->setPlaylist(m_mediaPlaylist);
......
m_mediaPlaylist->addMedia(QUrl::fromLocalFile(filePath));
......
m_mediaPlaylist->setCurrentIndex(index);
......
m_mediaPlayer->play();
......
m_mediaPlayer->pause();
......
m_mediaPlayer->stop();
QMediaPlayer除了播放、暂停、停止播放外,还有其他设置,例如设置声音大小,快进、快退等。都可以通过QMediaPlayer对象的函数进行设置。也可以通过QAudioProbe对象对播放的音频进行监听,实现播放音频声波的可视化。方法和录制一样。
通过QSound类播放音频:暂不介绍