20 QT裡的音效卡程式設計

2021-08-01 05:32:39 字數 2047 閱讀 7365

聲音三要素: 取樣率, 量化精度, 聲道

通常我們用一位二進位制表示兩種狀態, 如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()

二. 放音(過程與錄音差不多)

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函式把聲音資料交給音效卡發聲。

QT裡中文亂碼的處理

第一次學習寫qt程式,為了解決中文顯示亂碼問題,折騰了不少時間,現將最終方案記錄下。先在main.cpp裡 include qtextcodec codec qtextcodec codecforname utf 8 qtextcodec setcodecfortr codec qtextcodec...

QT 的UDP SOCKET程式設計

qt建立控制台專案,還是用最簡單的c s 模式.client端 udpclient.h ifndef udp udpclient h define udp udpclient h include include include pragma once class udpclient public q...

開始的QT程式設計

千辛萬苦的實習求職終於有了乙個還算讓人 下面是乙個簡單的qt程式,演示了如何設定控制項以及簡單的訊號和槽的機制。建立視窗物件作為qspinbox和qslider的父物件 qwidget window new qwidget qspinbox spinbox new qspinbox 生成乙個微調框視...