常見的音頻編碼格式包括MP3、AAC、OGG、WMA、FLAC等,它們之間具有以下區(qū)別:
-
編碼方式不同:這些編碼格式采用的編碼算法不同,例如MP3和AAC使用有損壓縮算法,而FLAC使用無損壓縮算法。
-
壓縮率和文件大小不同:由于采用的編碼算法不同,不同格式的音頻文件壓縮率和文件大小也不同。有損壓縮格式如MP3通常能夠?qū)⑽募嚎s至原始文件大小的10%左右,相對較小,但以犧牲一定的音質(zhì)為代價。無損壓縮格式如FLAC雖然壓縮率不如有損壓縮格式高,但保持了接近原始音頻文件的質(zhì)量,文件大小也比有損格式大。
-
支持性和兼容性不同:不同的音頻編碼格式在各種設備和軟件上的兼容性和支持性也不同。例如,MP3格式是最為普及的音頻格式之一,幾乎所有主流的音頻設備和軟件都支持;而FLAC格式雖然有著高保真的特點,但并不是所有設備和平臺都支持,特別是在移動設備上的使用較局限。
-
音質(zhì)表現(xiàn)不同:由于采用的編碼算法、參數(shù)和設置不同,不同格式的音頻文件在音質(zhì)表現(xiàn)上也會有所區(qū)別。例如,有些編碼格式對高音區(qū)的表現(xiàn)可能更優(yōu)秀,而有些編碼格式則可能更擅長處理低音區(qū)。
綜上所述,選擇哪種音頻編碼格式應根據(jù)實際需求和設備支持情況來判斷。如果需要在多平臺或多設備上播放音頻文件,一般建議選擇通用性較高、支持性廣泛的格式,如MP3、AAC等;如果注重音質(zhì),則可以考慮使用無損壓縮格式,如FLAC等。
MP3和AAC是兩種常見的音頻編碼格式,它們之間有以下區(qū)別:
-
編碼方式:MP3采用MPEG Audio Layer-3的編碼方式,而AAC采用Advanced Audio Coding的編碼方式。
-
壓縮效率:AAC相對于MP3具有更高的壓縮效率,即在相同的比特率下能夠提供更好的音質(zhì)。這意味著使用相同文件大小或比特率,AAC編碼的音頻文件往往會更清晰、更接近原始音頻。
-
音質(zhì)表現(xiàn):由于采用不同的編碼算法,AAC在相同比特率下通常具有更好的音質(zhì)表現(xiàn)。尤其在低比特率下,AAC能夠保持相對較好的音質(zhì),而MP3在低比特率下可能出現(xiàn)更明顯的失真和質(zhì)量損失。
-
文件大?。河捎贏AC更高的壓縮效率,相同音質(zhì)下的AAC文件大小通常會比MP3文件小一些。這對于存儲容量有限的設備和帶寬有限的網(wǎng)絡傳輸來說,可以節(jié)省空間和提升傳輸速度。
-
廣泛支持:MP3是最為廣泛支持的音頻格式之一,幾乎所有音頻設備和軟件都能播放MP3文件。而AAC作為較新的編碼格式,在一些舊版設備和軟件上可能不如MP3普及,但在現(xiàn)代設備和流媒體平臺上得到了廣泛支持。
總的來說,AAC相對于MP3具有更高的壓縮效率和更好的音質(zhì)表現(xiàn),而MP3則具有更廣泛的支持。選擇使用哪種格式應根據(jù)具體需求和設備的兼容性來決定。若追求更好的音質(zhì)或者希望節(jié)省空間和帶寬,AAC可能是更好的選擇;若需要在各種設備和軟件上保證兼容性,則MP3是一個較為安全的選擇。
????????音頻通道數(shù)是指音頻信號中包含的獨立聲音通道的數(shù)量。每個通道都可以攜帶單獨的音頻信息,例如左聲道、右聲道或者中央聲道等。
常見的音頻通道數(shù)有以下幾種:
-
單聲道(Mono):只有一個聲道,音頻信號通過一個單獨的通道進行傳輸。適用于部分語音、廣播和低成本音頻設備。
-
雙聲道(Stereo):包含左聲道(Left Channel)和右聲道(Right Channel),分別用于傳輸不同的音頻信息。大部分音樂、影視作品以及普通耳機、揚聲器都支持雙聲道。
-
立體聲(Joint Stereo):在雙聲道的基礎上,通過對左聲道和右聲道進行編碼,利用共享信息實現(xiàn)更高的壓縮效率。立體聲通常會保留左右聲道的獨立性,但一些低比特率的編碼方式可能會犧牲一定的聲音分離度。
-
多聲道(Multi-channel):除了左聲道和右聲道外,還包含額外的聲道,如中央聲道(Center Channel)、環(huán)繞聲道(Surround Channels)等。多聲道通常用于影院、家庭影院系統(tǒng),以及專業(yè)音頻領域,以提供更真實、沉浸式的音頻體驗。
音頻通道數(shù)決定了音頻信號可以攜帶的聲音分離度和立體感。選擇適合的音頻通道數(shù)取決于音頻內(nèi)容的特性以及播放設備的支持能力。例如,音樂作品通常會采用雙聲道或多聲道以提供立體聲效果,而語音錄音或電話通話可能只需要單聲道即可。
錄音時固定品質(zhì)和固定比特率是兩種不同的錄音設置方法,它們有以下區(qū)別:
-
固定品質(zhì):該設置方式的目的是保持錄制音頻的固定品質(zhì),通常以VBR(可變比特率)的方式實現(xiàn)。在固定品質(zhì)的設置下,編碼器會根據(jù)音頻信號的復雜程度動態(tài)調(diào)整比特率,使得音頻能夠達到相對穩(wěn)定并且高質(zhì)量的壓縮比率。因此,使用固定品質(zhì)設置可以獲得更好的音質(zhì)體驗,但文件大小可能會隨著音頻信號復雜程度的變化而發(fā)生變化。
-
固定比特率:該設置方式的目的是保持錄制音頻的固定比特率,通常以CBR(恒定比特率)的方式實現(xiàn)。在固定比特率的設置下,編碼器會始終以相同的比特率對音頻數(shù)據(jù)進行編碼,即使音頻信號復雜度發(fā)生變化,也不會改變編碼率。因此,使用固定比特率設置可以確保錄制的音頻文件大小、比特率的穩(wěn)定性,但音質(zhì)可能會受到影響,特別是在音頻信號復雜度變化較大的情況下。
總的來說,選擇固定品質(zhì)或固定比特率設置需要根據(jù)具體情況進行選擇。如果追求更好的音質(zhì)體驗,可以使用固定品質(zhì)設置;如果追求穩(wěn)定的文件大小和比特率,可以使用固定比特率設置。但需要注意的是,使用VBR設置時,音頻文件的大小可能會隨著信號復雜度的變化而產(chǎn)生變化,因此在一些容量受限或者網(wǎng)絡帶寬受限的場景下,需要權衡考慮。
qt6? 開發(fā)錄音主要是2個類:
- QMediaCaptureSession對象,用于采集音頻和視頻。
-
recorder
:QMediaRecorder對象,用于錄制音頻和視頻
QAudioInput 類? ?訪問連接到系統(tǒng)上的輸入設備 如麥克風等
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtMultimedia>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QMediaCaptureSession *session;
QMediaRecorder *recorder;
void closeEvent(QCloseEvent *event);
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
//自定義槽函數(shù)
void do_stateChanged(QMediaRecorder::RecorderState state);
void do_durationChanged(qint64 duration);
void on_actRecord_triggered();
void on_btnGetFile_clicked();
void on_actPause_triggered();
void on_actStop_triggered();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
這段代碼是一個使用Qt框架實現(xiàn)的主窗口類MainWindow的頭文件。下面對其進行解釋:
-
包含了必要的頭文件:
-
<QMainWindow>
:用于定義主窗口類的頭文件。 -
<QtMultimedia>
:包含了多媒體相關的類和函數(shù)。
-
-
命名空間聲明:
-
QT_BEGIN_NAMESPACE
?和?QT_END_NAMESPACE
:用于將后續(xù)內(nèi)容置于Qt命名空間中,防止命名沖突。 -
namespace Ui
:定義了一個名為Ui的命名空間。
-
-
類定義:
-
MainWindow
:繼承自QMainWindow
,表示主窗口類。 -
private
部分:包含了私有的成員變量和函數(shù),不可以直接訪問。-
session
:用于存儲多媒體捕捉會話對象的指針。 -
recorder
:用于存儲多媒體錄制對象的指針。 -
closeEvent
:處理關閉事件的函數(shù),通過重寫該函數(shù)可以自定義在窗口關閉時執(zhí)行的操作。
-
-
public
部分:包含了公共的成員函數(shù),可以從外部訪問。- 構(gòu)造函數(shù)
MainWindow
:用于創(chuàng)建MainWindow類的對象。 - 析構(gòu)函數(shù)
~MainWindow
:用于銷毀MainWindow類的對象。
- 構(gòu)造函數(shù)
-
private slots
部分:包含了一些私有槽函數(shù),用于處理信號和事件。-
do_stateChanged
:處理錄音狀態(tài)改變的槽函數(shù)。 -
do_durationChanged
:處理錄音時長改變的槽函數(shù)。 -
on_actRecord_triggered
:響應錄制觸發(fā)動作的槽函數(shù)。 -
on_btnGetFile_clicked
:響應獲取文件按鈕點擊事件的槽函數(shù)。 -
on_actPause_triggered
:響應暫停觸發(fā)動作的槽函數(shù)。 -
on_actStop_triggered
:響應停止觸發(fā)動作的槽函數(shù)。
-
-
private
部分:定義了一個私有成員變量ui
,用于存儲MainWindow窗口的用戶界面對象。
-
-
宏定義:
-
#ifndef MAINWINDOW_H
?和?#define MAINWINDOW_H
:用于避免頭文件的重復包含。
-
總體來說,這段代碼定義了一個主窗口類MainWindow,其中包含了一些私有成員變量、公共成員函數(shù)和私有槽函數(shù),用于實現(xiàn)多媒體錄音功能的控制和操作。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QFileInfo>
void MainWindow::closeEvent(QCloseEvent *event)
{
if (recorder->recorderState() != QMediaRecorder::StoppedState)
{
QMessageBox::information(this,"提示","正在錄音,不能退出");
event->ignore();
}
else
event->accept();
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
session = new QMediaCaptureSession(this); //QMediaCaptureSession是采集音頻、視頻的類
QAudioInput *audioInput= new QAudioInput(this);
session->setAudioInput(audioInput); // session 需要設置音頻輸入
recorder= new QMediaRecorder(this);
session->setRecorder(recorder); //為session 設置 recorder
connect(recorder,&QMediaRecorder::recorderStateChanged,
this,&MainWindow::do_stateChanged);
connect(recorder, &QMediaRecorder::durationChanged,
this, &MainWindow::do_durationChanged);
if (QMediaDevices::defaultAudioInput().isNull()) //如果沒有默認的音頻輸入設備
{
ui->groupBoxDevice->setTitle("錄音設置(無設備)");
ui->actRecord->setEnabled(false);
QMessageBox::information(this,"提示", "無音頻輸入設備");
return; //無音頻錄入設備
}
//音頻錄入設備列表
foreach (QAudioDevice device, QMediaDevices::audioInputs())
ui->comboDevices->addItem(device.description(), QVariant::fromValue(device));
QMediaFormat format; //默認的格式對象
//支持的編碼格式
foreach (QMediaFormat::AudioCodec encoder, format.supportedAudioCodecs(QMediaFormat::Encode))
ui->comboCodec->addItem(QMediaFormat::audioCodecDescription(encoder),
QVariant::fromValue(encoder));
//支持的文件格式
foreach (QMediaFormat::FileFormat fileFormat, format.supportedFileFormats(QMediaFormat::Encode))
ui->comboFileFormat->addItem(QMediaFormat::fileFormatDescription(fileFormat),
QVariant::fromValue(fileFormat));
//采樣頻率
int minSampRate=audioInput->device().minimumSampleRate(); //輸入設備支持的最低采樣率
ui->comboSampleRate->addItem(QString("Minimum %1").arg(minSampRate), minSampRate);
int maxSampRate=audioInput->device().maximumSampleRate(); //輸入設備支持的最高采樣率
ui->comboSampleRate->addItem(QString("Maximum %1").arg(maxSampRate), maxSampRate);
ui->comboSampleRate->addItem("16000", 16000); //添加了用戶數(shù)據(jù)
ui->comboSampleRate->addItem("44100", 44100);
ui->comboSampleRate->addItem("48000", 48000);
ui->comboSampleRate->addItem("88200", 88200);
//通道數(shù)
int minChan=audioInput->device().minimumChannelCount(); //最少通道數(shù)
ui->comboChannels->addItem(QString("Minimum %1").arg(minChan), minChan);
int maxChan=audioInput->device().maximumChannelCount(); //最多通道數(shù)
ui->comboChannels->addItem(QString("Maximum %1").arg(maxChan), maxChan);
ui->comboChannels->addItem("1", 1);
ui->comboChannels->addItem("2", 2);
//固定品質(zhì)
ui->sliderQuality->setRange(0, int(QImageCapture::VeryHighQuality));
ui->sliderQuality->setValue(int(QImageCapture::NormalQuality));
//固定比特率
ui->comboBitrate->addItem("32000");
ui->comboBitrate->addItem("64000");
ui->comboBitrate->addItem("96000");
ui->comboBitrate->addItem("128000");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::do_stateChanged(QMediaRecorder::RecorderState state)
{ //錄音狀態(tài)變化
bool isRecording = state==QMediaRecorder::RecordingState; //正在錄制
ui->actRecord->setEnabled(!isRecording);
ui->actPause->setEnabled(isRecording);
ui->actStop->setEnabled(isRecording);
ui->btnGetFile->setEnabled(state==QMediaRecorder::StoppedState);
}
void MainWindow::do_durationChanged(qint64 duration)
{//錄音持續(xù)時間變化
ui->labPassTime->setText(QString("已錄制 %1 秒").arg(duration / 1000));
}
//void MainWindow::processBuffer(const QAudioBuffer &buffer)
//{ //處理探測到的緩沖區(qū)
// ui->spin_byteCount->setValue(buffer.byteCount());//緩沖區(qū)字節(jié)數(shù)
// ui->spin_duration->setValue(buffer.duration()/1000);//緩沖區(qū)時長
// ui->spin_frameCount->setValue(buffer.frameCount());//緩沖區(qū)幀數(shù)
// ui->spin_sampleCount->setValue(buffer.sampleCount());//緩沖區(qū)采樣數(shù)
// QAudioFormat audioFormat=buffer.format();//緩沖區(qū)格式
// ui->spin_channelCount->setValue(audioFormat.channelCount()); //通道數(shù)
// ui->spin_sampleSize->setValue(audioFormat.sampleSize());//采樣大小
// ui->spin_sampleRate->setValue(audioFormat.sampleRate());//采樣率
// ui->spin_bytesPerFrame->setValue(audioFormat.bytesPerFrame());//每幀字節(jié)數(shù)
// if (audioFormat.byteOrder()==QAudioFormat::LittleEndian)
// ui->edit_byteOrder->setText("LittleEndian");//字節(jié)序
// else
// ui->edit_byteOrder->setText("BigEndian");
// ui->edit_codec->setText(audioFormat.codec());//編碼格式
// if (audioFormat.sampleType()==QAudioFormat::SignedInt)//采樣點類型
// ui->edit_sampleType->setText("SignedInt");
// else if(audioFormat.sampleType()==QAudioFormat::UnSignedInt)
// ui->edit_sampleType->setText("UnSignedInt");
// else if(audioFormat.sampleType()==QAudioFormat::Float)
// ui->edit_sampleType->setText("Float");
// else
// ui->edit_sampleType->setText("Unknown");
//}
void MainWindow::on_actRecord_triggered()
{ //開始錄音
if (recorder->recorderState() == QMediaRecorder::PausedState)
{//若是暫停狀態(tài),就繼續(xù)錄音
recorder->record();
return;
}
QString selectedFile=ui->editOutputFile->text().trimmed();
if (selectedFile.isEmpty())
{
QMessageBox::critical(this,"錯誤","請先設置錄音輸出文件");
return;
}
if (QFile::exists(selectedFile))
QFile::remove(selectedFile);
recorder->setOutputLocation(QUrl::fromLocalFile(selectedFile)); //設置輸出文件
//設置session的輸入設備
// QVariant var =ui->comboDevices->itemData(ui->comboDevices->currentIndex());
// QAudioDevice audioDevice= var.value<QAudioDevice>();
// session->audioInput()->setDevice(audioDevice);
session->audioInput()->setDevice(QMediaDevices::defaultAudioInput());
//設置 recorder 的 mediaFormat 參數(shù),包括文件格式和編碼格式
QMediaFormat mediaFormat;
QVariant var=ui->comboCodec->itemData(ui->comboCodec->currentIndex());
QMediaFormat::FileFormat fileFormat= var.value<QMediaFormat::FileFormat>();
mediaFormat.setFileFormat(fileFormat); //設置文件格式
var=ui->comboFileFormat->itemData(ui->comboFileFormat->currentIndex());
QMediaFormat::AudioCodec audioCodec =var.value<QMediaFormat::AudioCodec>();
mediaFormat.setAudioCodec(audioCodec); //設置編碼格式
recorder->setMediaFormat(mediaFormat); //設置mediaFormat
//設置 recorder 的其他參數(shù)
var=ui->comboSampleRate->itemData(ui->comboSampleRate->currentIndex());
recorder->setAudioSampleRate(var.toInt()); //設置采樣率
var=ui->comboChannels->itemData(ui->comboChannels->currentIndex());
recorder->setAudioChannelCount(var.toInt()); //設置通道數(shù)
recorder->setAudioBitRate(ui->comboBitrate->currentText().toInt()); //設置比特率
recorder->setQuality(QMediaRecorder::Quality(ui->sliderQuality->value())); //設置品質(zhì)
if (ui->radioQuality->isChecked()) //設置編碼模式
recorder->setEncodingMode(QMediaRecorder::ConstantQualityEncoding); //固定品質(zhì)
else
recorder->setEncodingMode(QMediaRecorder::ConstantBitRateEncoding); //固定比特率
recorder->record();
}
void MainWindow::on_btnGetFile_clicked()
{ //設置保存文件
QString curPath=QDir::currentPath();//獲取系統(tǒng)當前目錄
QString dlgTitle="選擇輸出文件"; //對話框標題
QString filter="所有文件(*.*);;MP3文件(*.mp3);;WMA文件(*.wma);;MP4文件(*.mp4)"; //文件過濾器
QString selectedFile=QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter);
if (!selectedFile.isEmpty())
{
ui->editOutputFile->setText(selectedFile);
QFileInfo fileInfo(selectedFile);
QDir::setCurrent(fileInfo.absolutePath());
}
}
void MainWindow::on_actPause_triggered()
{ //暫停
recorder->pause();
}
void MainWindow::on_actStop_triggered()
{//停止
recorder->stop();
}
這段代碼是一個錄音應用的主窗口類的實現(xiàn)。它使用Qt框架提供的多媒體模塊來實現(xiàn)錄音功能。
主要的成員變量包括:
-
session
:QMediaCaptureSession對象,用于采集音頻和視頻。 -
recorder
:QMediaRecorder對象,用于錄制音頻和視頻。
主要的成員函數(shù)包括:
-
closeEvent()
:重寫了窗口關閉事件,如果正在錄音,則彈出提示框,阻止窗口關閉。 -
do_stateChanged()
:槽函數(shù),處理錄音狀態(tài)變化的信號。根據(jù)錄音狀態(tài),啟用或禁用相關按鈕。 -
do_durationChanged()
:槽函數(shù),處理錄音持續(xù)時間變化的信號。更新顯示錄音時長的標簽。 -
on_actRecord_triggered()
:槽函數(shù),處理開始錄音按鈕的點擊事件。設置錄音輸出文件、音頻輸入設備、媒體格式等參數(shù),并開始錄音。 -
on_btnGetFile_clicked()
:槽函數(shù),處理選擇輸出文件按鈕的點擊事件。打開文件對話框,選擇保存錄音文件的路徑。 -
on_actPause_triggered()
:槽函數(shù),處理暫停錄音按鈕的點擊事件。暫停錄音。 -
on_actStop_triggered()
:槽函數(shù),處理停止錄音按鈕的點擊事件。停止錄音。
在構(gòu)造函數(shù)中,通過獲取音頻輸入設備列表,并分別添加到音頻輸入設備的下拉列表中。同時,還獲取了支持的編碼格式、文件格式、采樣頻率、通道數(shù)等信息,并將其分別添加到對應的下拉列表中。文章來源:http://www.zghlxwxcb.cn/news/detail-723874.html
????????總體來說,這段代碼實現(xiàn)了一個簡單的錄音應用的主窗口界面和錄音功能的實現(xiàn)。用戶可以選擇音頻輸入設備、設置媒體格式參數(shù),開始錄音,并可以暫停、停止錄音,并選擇保存錄音文件的路徑。文章來源地址http://www.zghlxwxcb.cn/news/detail-723874.html
到了這里,關于qt6 多媒體開發(fā)代碼分析(二、錄音)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!