Qt音頻采集:QAudioInput詳解與示例

1. 簡介

QAudioInput是Qt Multimedia模塊中用于音頻采集的核心類,能夠從麥克風等輸入設備實時獲取原始音頻數據(PCM格式)。本文將通過原理講解和代碼示例,幫助開發者快速掌握音頻采集的核心技術。


2. 核心功能

  • 支持多種音頻格式(采樣率/聲道/位深)

  • 提供實時音頻流訪問

  • 自動管理音頻設備資源

  • 支持多平臺(Windows/Linux/macOS/移動端)


3. 開發準備

3.1 環境要求

# .pro文件添加
QT += multimedia

3.2 頭文件

#include <QAudioInput>
#include <QAudioDeviceInfo>

4. 核心類說明

4.1 QAudioInput

  • 核心方法

    • start(): 開始采集

    • stop(): 停止采集

    • setBufferSize(): 設置緩沖區大小

4.2 QAudioFormat

  • 常用配置

    format.setSampleRate(16000);      // 16kHz采樣率
    format.setChannelCount(1);        // 單聲道
    format.setSampleSize(16);         // 16位采樣
    format.setCodec("audio/pcm");     // PCM編碼
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::SignedInt);

5. 基礎使用流程

5.1 初始化設備

// 創建音頻格式
QAudioFormat format;
// ...(設置格式參數)// 獲取輸入設備
QAudioDeviceInfo inputDevice = QAudioDeviceInfo::defaultInputDevice();
if (!inputDevice.isFormatSupported(format)) {format = inputDevice.nearestFormat(format);
}// 創建音頻輸入對象
QAudioInput* audioInput = new QAudioInput(inputDevice, format, this);

5.2 數據采集與保存

// 創建文件保存原始數據
QFile outputFile("raw.pcm");
outputFile.open(QIODevice::WriteOnly);// 開始采集
audioInput->start(&outputFile);

6. 完整示例代碼

示例1:保存為WAV文件(含文件頭)

#include <QCoreApplication>
#include <QAudioInput>
#include <QFile>
#include <QDataStream>// WAV文件頭結構(44字節)
struct WavHeader {// ...(完整文件頭結構定義,此處省略)
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 配置音頻格式QAudioFormat format;format.setSampleRate(16000);format.setChannelCount(1);format.setSampleSize(16);format.setCodec("audio/pcm");format.setByteOrder(QAudioFormat::LittleEndian);format.setSampleType(QAudioFormat::SignedInt);// 初始化設備QAudioInput audioInput(QAudioDeviceInfo::defaultInputDevice(), format);// 創建WAV文件QFile file("recording.wav");file.open(QIODevice::WriteOnly);// 寫入空文件頭WavHeader header = createWavHeader(format);file.write((const char*)&header, sizeof(header));// 開始錄音audioInput.start(&file);// 錄音5秒后停止QTimer::singleShot(5000, [&]() {audioInput.stop();file.close();qApp->quit();});return a.exec();
}

示例2:實時音量監測

class AudioMonitor : public QIODevice {
public:explicit AudioMonitor(QObject* parent = nullptr) : QIODevice(parent) {}protected:qint64 readData(char*, qint64) override { return 0; } // 不需要實現qint64 writeData(const char* data, qint64 len) override {// 計算音量(16位樣本)const qint16* samples = reinterpret_cast<const qint16*>(data);int sampleCount = len / 2; // 每個樣本占2字節qreal peak = 0;for (int i=0; i<sampleCount; ++i) {peak = qMax(peak, qAbs(samples[i]/32768.0));}emit volumeChanged(peak * 100); // 百分比return len;}signals:void volumeChanged(qreal percent);
};// 使用方式:
AudioMonitor* monitor = new AudioMonitor;
audioInput->start(monitor);
QObject::connect(monitor, &AudioMonitor::volumeChanged, [](qreal vol){qDebug() << "當前音量:" << vol << "%";
});

7. 常見問題解決方案

7.1 無輸入數據

  • 檢查項

    1. 系統麥克風權限

    2. 音頻格式與設備兼容性

    3. 緩沖區大小設置(setBufferSize(2048)

7.2 錄音文件雜音

  • 解決方法

    • 添加靜音檢測邏輯

    • 使用噪聲抑制算法

    • 調整麥克風增益

7.3 延遲過高

  • 優化方法

    audioInput->setBufferSize(512);  // 減小緩沖區
    QThread::highPriority();         // 提升線程優先級

8. 關鍵知識點總結

要點說明
格式匹配必須與硬件支持格式一致
實時性處理避免在回調中進行耗時操作
資源釋放stop()后及時釋放設備
跨平臺差異特別注意移動端權限問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900454.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900454.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900454.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

下載安裝Node.js及其他環境

提示&#xff1a;從Node版本降級到Vue項目運行 文章目錄 下載Node.js環境配置配置環境變量 安裝 cnpm&#xff08;我需要安裝&#xff09;安裝腳手架安裝依賴安裝淘寶鏡像&#xff08;注意會更新&#xff09;cnpm vs npm 與新舊版本核心差異包管理器不同功能差異如何選擇&#…

【后端】ORM / ODM

長期不定期更新&#xff0c;建議關注收藏點贊。 概述 ORM&#xff08;Object-Relational Mapping&#xff0c;對象關系映射&#xff09;&#xff1a;面向關系型數據庫&#xff0c;ORM將對象映射到數據庫的表和行&#xff08;例如MySQL、PostgreSQL&#xff09;。ODM&#xff0…

無限滾動(Infinite Scroll)頁面谷歌不收錄!必須改回分頁嗎?

近三年&#xff0c;全球超過58%的網站采用無限滾動設計&#xff08;數據來源&#xff1a;PageTraffic 2023&#xff09; 谷歌官方數據顯示&#xff0c;動態加載內容的索引失敗率高達73%&#xff08;Google Webmaster Report 2022&#xff09;&#xff0c;而采用純無限滾動的頁…

手寫JSX實現虛擬DOM

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

網絡性能優化參數關系解讀 | TCP Nagle / TCP_NODELAY / TCP_QUICKACK / TCP_CORK

注&#xff1a;本文為 “網路性能優化” 相關文章合輯。 未整理去重。 如有內容異常&#xff0c;請看原文。 TCP_NODELAY 詳解 lenky0401 發表于 2012-08-25 16:40 在網絡擁塞控制領域&#xff0c;Nagle 算法&#xff08;Nagle algorithm&#xff09;是一個非常著名的算法&…

玄機-應急響應-webshell查殺

題目要求&#xff1a; 要求獲取四個flag webshell查殺&#xff1a; 常見的webshell&#xff1a; PHP: eval(), system(), exec(), shell_exec(), passthru(), assert(), base64_decode() ASP: Execute(), Eval(), CreateObject() JSP: Runtime.getRuntime().exec() websh…

docker存儲卷及dockers容器源碼部署httpd

1. COW機制 Docker鏡像由多個只讀層疊加而成,啟動容器時,Docker會加載只讀鏡像層并在鏡像棧頂部添加一個讀寫層。 如果運行中的容器修改了現有的一個已經存在的文件,那么該文件將會從讀寫層下面的只讀層復制到讀寫層,該文件的只讀版本依然存在,只是已經被讀寫層中該文件…

PyTorch中卷積層torch.nn.Conv2d

在 PyTorch 中&#xff0c;卷積層主要由 torch.nn.Conv1d、torch.nn.Conv2d 和 torch.nn.Conv3d 實現&#xff0c;分別對應一維、二維和三維卷積操作。以下是詳細說明&#xff1a; 1. 二維卷積 (Conv2d) - 最常用 import torch.nn as nn# 基本參數 conv nn.Conv2d(in_channe…

從 ZStack 獲取物理機與云主機信息并導出 Excel 文件

文章目錄 從 ZStack 獲取物理機與云主機信息并導出 Excel 文件環境zstack 官網客戶端封裝講解 獲取物理機信息講解 獲取云主機信息并關聯物理機講解 導出數據到 Excel 文件講解 運行主程序講解 總結最終文檔效果完整代碼 從 ZStack 獲取物理機與云主機信息并導出 Excel 文件 在…

5.好事多磨 -- TCP網絡連接Ⅱ

前言 第4章節通過回聲服務示例講解了TCP服務器端/客戶端的實現方法。但這僅是從編程角度的學習&#xff0c;我們尚未詳細討論TCP的工作原理。因此&#xff0c;將詳細講解TCP中必要的理論知識&#xff0c;還將給出第4章節客戶端問題的解決方案。 一、回聲客戶端完美實現 第4章…

sql server數據庫可疑修復

sql server數據庫可疑修復 從上圖可以看到數據庫nchrdb顯示可疑&#xff0c;導致原因為NC系統在增加公共薪資項目的時候&#xff0c;擴展字段報錯了&#xff0c;第一次遇到這種情況&#xff0c;折騰了很久終于解決&#xff0c;記下解決方案&#xff1a; 1&#xff0c;將SQL數據…

Flutter之頁面布局二

目錄&#xff1a; 1、列表布局1.1、基礎列表1.2、水平滑動的列表1.3、網格列表1.3、不同列表項的列表1.4、包含間隔的列表1.6、長列表 2、滾動2.1、浮動的頂欄2.2、平衡錯位滾動 1、列表布局 1.1、基礎列表 import package:flutter/material.dart;void main() > runApp(con…

ARM------硬件程序開發

硬件程序開發流程 相關硬件的工作原理 理解硬件的工作原理&#xff0c;明確硬件的功能和用途。 硬件連接 將硬件設備正確連接到開發板上。 編寫程序 根據硬件功能編寫相應的程序代碼。 調試驗證 通過調試工具驗證程序的正確性&#xff0c;確保硬件功能正常。 控制LED的…

《QT從基礎到進階·七十四》Qt+C++開發一個python編譯器,能夠編寫,運行python程序改進版

1、概述 源碼放在文章末尾 根據上一篇文章回顧下利用QtC實現了一個簡易的python編譯器&#xff0c;類似pycharm或vsCode這樣的編譯器&#xff0c;該python編譯器目前實現了如下功能&#xff1a; &#xff08;1&#xff09;支持編寫python程序 &#xff08;2&#xff09;編寫代…

Winform MQTT客戶端連接方式

項目中使用到Winform的數據轉發服務&#xff0c;所以記錄下使用到的方法。 一.創建單例模板 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp.Scripts {public class SingleTon&…

Windows強制刪除任何你想刪除的文件和文件夾

Windows強制刪除任何你想刪除的文件和文件夾 本教程適用于 Windows 10/11 系統&#xff0c;工具和命令均經過驗證。 為什么刪除會失敗&#xff1f; 權限不足&#xff1a;文件或文件夾可能需要管理員權限才能刪除。文件被占用&#xff1a;某個程序正在使用目標文件&#xff0c…

Jmeter如何使用MD5進行加密?

在軟件測試中&#xff0c;使用 JMeter 對數據進行 MD5 加密是一項常見需求&#xff0c;尤其是在模擬用戶登錄等涉及密碼加密的場景時。下面詳細介紹在 JMeter 里運用 MD5 加密的具體步驟。 1. 添加 BeanShell 預處理器 JMeter 本身沒有直接的 MD5 加密功能&#xff0c;但可以…

4-c語言中的數據類型

一.C 語?中的常量 1.生活中的數據 整數&#xff1a; 100,200,300,400,500 小數: 11.11 22.22 33.33 字母&#xff1a; a&#xff0c;b&#xff0c;c&#xff0c;d A&#xff0c;B&#xff0c;C&#xff0c;D 在 C 語?中我們把字?叫做字符. 字符?單引號引?。例如A’ 單詞…

中鈞科技通過數字賦能,編織“數字互聯網”助力數字化進程!

時間飛逝轉眼間2025年已過去四分之一&#xff0c;作為一名95后回顧當下的生活&#xff0c;忍不住感慨10年和現在的對比。發現現在的手機支付、網上掛號、APP打車、在線學習、網絡訂餐、線上協同辦公都以逐漸成為人們生活、工作的常態。也正是在這樣的常態背景下&#xff0c;加快…

AI重塑云基礎設施,亞馬遜云科技打造AI定制版IaaS“樣板房”

AI正在徹底重塑云基礎設施。 IDC最新《2025年IDC MarketScape&#xff1a;全球公有云基礎設施即服務&#xff08;IaaS&#xff09;報告》顯示&#xff0c;AI正在通過多種方式重塑云基礎設施&#xff0c;公有云IaaS有望繼續保持快速增長&#xff0c;預計2025年全球IaaS的整體規…