学电脑从零开始教程完整版,qt里的格点布局和水平布局能叠加使用吗
音频输入可以使用QAudioRecorder 类或QAudioInput 类来实现。 QAudioRecorder 是一种高级实现,它将输入音频数据直接保存为文件,并且还允许通过QAudioProbe 访问原始音频数据。 QAudioInput 是一个低级实现,它直接控制音频输入设备的参数并将音频录制数据写入流设备。
1.QAudioRecorder录制音频。 QAudioRecorder 是一个用于录制音频的类。继承自QMediaRecorder 类,需要更少的代码来录制音频并将其保存到文件。下图是运行使用QAudioRecorder 录制音频文件的界面的程序示例。
QAudioRecorder 需要使用QAudioEncoderSettings 类型的变量输入音频设置,主要是高级设置,例如编码格式、采样率、通道数和音频质量。窗口界面左侧是音频输入设置。
设置输出保存文件后,您可以使用QAudioRecorder来录制文件,录制的数据将自动保存到文件中。音频输入设备根据您的音频设置自动确定底层采样参数。使用QAudioProbe类获取音频输入缓冲区参数和原始数据。窗口右侧显示音频输入缓冲区数据参数,包括缓冲区字节数、帧数、样本数、样本字长、采样率等。通过这些参数,可以恢复原始的音频数据。从缓冲区读取。
2、实现QAudioRecorder录音功能主窗口继承自QMainWindow 界面使用UI Designer进行设计界面组件的设计和布局不再详细描述主窗口类MainWindow的定义如下(UI(生成的接口部分的槽函数的定义省略)。
class MainWindow : public QMainWindow{Q_OBJECTpublic: MainWindow(QWidget *parent=nullptr); ~MainWindow();private: Ui:MainWindow *ui; QAudioRecorder *recorder;//音频录制QAudioProbe *probe; //探测私有槽: //自定义槽函数void onStateChange d (QMediaRecorder:State state); void onDurationChanged(qint64duration); void processBuffer(const QAudioBuffer Buffer);}; 使用QAudioRecorder类型变量记录器进行录音,使用QAudioProbe类型变量探针检测缓冲区数据。
还定义了与记录器和探头信号相关的三个槽函数。在窗口的构造函数中创建变量并将信号和槽关联起来。窗口构造函数的代码如下:
MainWindow:Mainwindow (qwidget *Parent) : qminwindow (Parent), UI (New UI:3360MainWindow) {UI-SetupUI(this); Recorder=new.QAUDIORECORDER(this); Connect(Recorder, SIGNAL(StateChanged(QMEDIARECORDER:3360State)), this, Slot( OnStateChanged (QMediaRecorder:State))); connect(recorder, SIGNAL(durationChanged(qint64)), this, SLOT(onDurationChanged(qint64)));probe=new QAudioProbe;//探测connect(probe, SIGNAL(audioBufferProbed(QAudioBuffer)), this, SLOT(processBuffer(QAudioBuffer)));probe-setSource(recorder); if(recorder-defaultAudioInput().isEmpty()) return; //没有音频输入设备foreach(const QString device, Recorder-audioInputs() ) ui-comboDevices-addItem(device); //音频输入设备foreach(const QString codecName, Recorder-supportedAudioCodecs()) ui-comboCodec-addItem(codecName); //支持的音频编码foreach(int SampleRate, Recorder ui-comboChannels- addItem(' 4 '); //质量UI-Sliderquality-SetRANGE (0, int (qmultimedia:veryHighquality)); UI-Sliderquality-SetValue a:NORMALQULITY); //比特率: UI-COMBOBITRATE-ADDITEM ('32000'); -addItem(' 64000'); ui-comboBitrate-addItem('96000'); ui-comboBitrate-addItem('128000');} 槽函数onStateChanged() 与记录器的stateChanged() 信号关联,记录器的状态发生变化出现这种情况时,“录音”控制界面上的“暂停”和“停止”按钮将被启用。
槽函数onDurationChanged()与记录器的durationChanged()信号相关联。当更改录制时间以更新界面上的时间显示时,会发出此信号。这两个槽函数的代码如下。
void MainWindow:onStateChanged(QMediaRecorder:State state){ //更改录制状态ui-actStart-setEnabled(state!=QMediaRecorder:RecordingState); ui-actPause-setEnabled(state==QMediaRecorder:RecordingState); ui-actS top- setEnable d(状态==QMediaRecorder:RecordingState) ; UI-btngetFile-setEnabled(state==qMediarecorder:3:StoppedState); ui-edtfile-setenabled(state==qMediareC:3:stoppedState;} void mainwindow333333:ondertbess usistertbes;} (QString)('记录1 Second ' ).arg(duration/1000));} Probe 探针通过setSource()指定检测对象。探头的检测对象是录音机。
probe-setSource(recorder); QAudioProbe 还可以在音频播放期间执行缓冲区检测。即可以指定一个QMediaPlayer对象作为检测对象。
槽函数processBuffer() 与探测信号audioBufferProbed() 关联,该信号传递QAudioBuffer 类型的变量,该变量包含缓冲区信息和音频的原始数据。
构造函数的后半部分使用QAudioRecorder 类中的以下函数来初始化界面上录音设置组件的内容。
defaultAudioInput()函数检索默认音频输入设备名称,audioInputs()函数检索音频输入设备列表,supportedAudioCodecs()函数检索支持的音频编码列表,supportedAudioSampleRates()函数获取支持的音频列表采样率。选择录音输出文件后,您可以使用界面上的“录音”、“暂停”和“停止”三个按钮来控制录音。三个按钮的代码是:
void MainWindow:on_actStart_triggered(){ //开始录制if(recorder-state()==QMediaRecorder:StoppedState){ //停止,重置QString selectedFile=ui-edtFile-text().trimmed(); if(selectedFile.isEmpty();录制设置输出文件不可删除'); return; } } Recorder-setOutputLocation(QUrl:fromLocalFile(selectedFile)); Recorder-setAudioInput(ui-comboDevices-currentText()); //输入设备QAudioEncoderSettings settings; //音频编码设置。 setCodec(ui-comboCodec-currentText());//编码settings.setSampleRate(ui-comboSampleRate-currentText().toInt()); settings.setBitRate(ui-comboBitrate-currentText().toInt());//码率settings.setChannelCount(ui-comboChannels-currentText().toInt()); settings.setQuality(QMultimedia:EncodingQuality(ui-sliderQuality-value())); if(ui-radioQuality-isChecked() ) //编码模式固定Quality settings.setEncodingMode(QMultimedia:ConstantQualityEncoding); else settings.setEncodingMode(QMultimedia:ConstantBitRateEncoding); Recorder-setAudioSettings(settings); //音频设置} Recorder-record();}void MainWindow:on_actPause_triggered(){//Pause 暂停录音机() ; }void MainWindow:on_actStop_triggered(){//Stop Recorder-stop();} 要开始、暂停或停止录音,只需调用QAudioRecorder 的Record()、Pause() 和stop() 函数即可。state() 会发生。对QAudioRecorder 进行更改,发出stateChanged() 信号,并在关联的槽函数onStateChanged() 中更新界面按钮的有效状态。
在Record按钮代码中,当您在停止状态下单击Record时,将使用setOntputLocation()根据界面上的输入保存文件;并使用setAudioInput()设置音频输入。设备;然后使用QAudioEncoderSettings 类型的变量设置。获取录音设置,包括:
setCodec() 设置音频编码('audio/pcm' 是未编码的音频格式)。 setSampleRate() 设置采样率(8000 Hz 是最低采样率,44100 Hz 是常见的CD 和MP3 采样率)。 96000Hz 是音轨中使用的高分辨率采样率。 setChannelCount() 设置通道数。常见的是单声道、立体声(2 声道)和4 声道环绕声(4 声道)。 setBitRate() 是比特率。如果使用QAudioEncoderSettings:setEncodingMode() 设置,则编码模式为QMultimedia:ConstantBitRateEncoding,并且音频输入设备使用恒定比特率。比特率越高,音质越好。这通常会产生更高质量的音频,例如128 kbps。 setQuality()设置录音质量,传入的参数表示录音质量。枚举QMultimedia:Encoding Quality 有从“VeryLowQuality”到“VeryHighQuality”的五个级别。当编码模式设置为固定质量时,音频输入设备会根据质量要求自动设置底层采样率、字长等参数。配置完成后,设置录音机的音频参数。
Recorder-setAudioSettings(settings); 3、QAudioProbe获取音频输入缓冲区数据参数,当点击录音按钮时,可以根据设置进行录音,录音数据会自动保存到指定的保存文件中。得救了。 QAudioProbe类型的变量探针用于检测录音数据,因此在录音过程中,更新录音缓冲区中的数据后,探针会发出audioBufferProbed()信号。与audioBufferProbed()信号关联的自定义槽函数processBuffer()查询并显示缓冲区中的数据信息。这是代码:
void MainWindow:processBuffer(const QAudioBufferbuffer){//处理检测到的缓冲区ui-spin_byteCount-setValue(buffer.byteCount());//缓冲区的字节数ui-spin_duration-setValue(buffer.duration()/1000) ;//缓冲周期ui-spin_frameCount-setValue(buffer.frameCount());//缓冲帧数ui-spin_sampleCount-setValue(buffer.sampleCount());//缓冲样本数QAudioFormat audioFormat=buffer.format (); //缓冲区格式ui-spin_channelCount-setValue(audioFormat.channelCount()); //通道数ui-spin_sampleSize-setValue(audioFormat.sampleSize()); //采样大小ui-spin_sampleRate-setValue(audioFormat.sampleRate()) ;//采样率ui-spin_bytesPerFrame-setValue(audioFormat.bytesPerFrame()); if(audioFormat.byteOrder()==QAudioFormat:LittleEndian) ui-edt_byteOrder-setText('LittleEndian'); //字节顺序else ui-edt_byteOrder-setText(' BigEndian'); ui-edt_codec-setText(audioFormat.codec()); //编码格式if(audioFormat.sampleType()==QAudioFormat:SignedInt) //采样点类型ui-edt_sampleType-setText( 'SignedInt') ; else if (audioFormat.sampleType()==QAudioFormat:UnSignedInt) ui-edt_sampleType-setText('UnSignedlnt'); else if(audioFormat.sampleType()==QAudioFormat:Float) ui-edt_sampleType-setText('Float '); else ui- edt _sampleType- setText ('Unknown');} Signal audioBufferProbed() 传递一个QAudioBuffer 类型的参数缓冲区,其中包含音频采样参数和缓冲区的音频原始数据。音频格式参数可以通过QAudioBuffer:format()函数获取。
QAudioFormat audioFormat=buffer.format();buffer.format() 返回一个QAudioFormat 类型的变量,用于存储音频格式参数信息。如果你想使用原始音频数据,你需要了解这些参数。
ChannelCount() 返回音频数据的实际通道数。这与前一个音频设置的通道数相匹配。 SampleSize() 返回采样点的数量(通常为8、16 和32 位),表示采样数据点的量化数量。位数越高,声音的分辨率和保真度就越高。一般来说,16 位可以让您达到CD 音频质量。 SampleRate() 返回实际采样频率。这通常大于或等于音频输入设置的采样率。实际采样率也会根据设定的质量要求自动设置。 SampleType() 返回采样点的格式。这是指必须表示采样点的数据类型,例如无符号整数(UnSignedInt)、有符号整数(SignedInt)或浮点数(Float)。 byteOrder()返回字节顺序,分为big-endian字节顺序和little-endian字节顺序。 codec() 返回实际的编码。 bytesPerFrame() 返回每帧的字节数。不同的音频编码格式有不同的帧定义。一帧PCM是每个通道一个采样数据。 QAudioBuffer 还有其他描述缓冲区数据信息的函数。
FrameCount() 返回帧数。对于以PCM格式编码的音频数据,一帧是采样点。该函数返回缓冲区中数据点的帧数。 SampleCount() 返回样本数。样本数=帧数* 通道数。 byteCount() 返回缓冲区中的字节数。采样点为8位,即1个字节,因此字节数=样本数*采样的字节数。 uration() 返回由帧数和采样频率确定的缓冲区持续时间。 QAudioBuffer:data() 函数返回缓冲区中存储的原始音频数据。获得这些原始数据后,您可以分析或处理数据。例如,对于语音识别,我们首先需要获得这些原始音频数据。
使用QAudioRecorder进行音频输入时,由于设置的采集参数和音频质量要求不同,底层音频采样参数会自动调整。
因此,当您使用QAudioBuffer:data()读取原始数据时,必须根据QAudioBuffer:format()返回的格式参数以及缓冲帧数、样本数等参数正确读取原始数据。此示例未显示原始数据。数据被读取。 ————————————————如果对您有帮助,请关注、点赞、谢谢!如果您想要本系列文章相关任意示例的完整代码,请关注我们并在评论区留言。
天地劫幽城再临归真4-5攻略:第四章归真4-5八回合图文通关教学[多图],天地劫幽城再临归真4-5怎么样八回合内通
2024-04-19