Qt Multimedia 提供瞭涵蓋低級/高級途徑的一係列音頻類:音頻輸入、輸齣和處理。
對於播放不簡單媒體或音頻文件、未壓縮音頻,可以使用 QMediaPlayer C++ 類,或 MediaPlayer QML 類型。 QMediaPlayer 類和關聯 QML 類型還能播放 視頻 ,若有要求。
見 支持的媒體格式 for more detail.
媒體播放器需要連接到 QAudioOutput 對象 (或 QML AudioOutput 元素) 以迴放音頻。
這裏是如何使用 C++ 播放本地文件:
player = new QMediaPlayer; audioOutput = new QAudioOutput; player->setAudioOutput(audioOutput); // ... player->setSource(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3")); audioOutput->setVolume(0.5); player->play();
QML 中的相同功能:
MediaPlayer { audioOutput: AudioOutput {} source: "file:///path/to/my/music.mp3" Component.onCompleted: { play() } }
要將音頻錄製到文件,需要創建捕獲會話並把音頻輸入和錄製器連接到它。這些元素的實現是采用 QMediaCaptureSession , QAudioInput ,和 QMediaRecorder 類。默認構造 QAudioInput 選擇係統默認音頻輸入。錄製器采用簡單 record() 和 stop() 函數控製記錄過程。此外,還可以使用它選擇輸齣位置、音頻編碼器或文件容器格式。
從默認麥剋風錄製音頻的會話,在 C++ 中看起來如下:
QMediaCaptureSession session; QAudioInput audioInput; session.setAudioInput(&input); QMediaRecorder recorder; session.setRecorder(&recorder); recorder.setQuality(QMediaRecorder::HighQuality); recorder.setOutputLocation(QUrl::fromLocalFile("test.mp3")); recorder.record();
在 QML 中,同樣可以達成通過:
CaptureSession { audioInput: AudioInput {} mediaRecorder: MediaRecorder { id: recorder outputLocation: "file:///path/to/test.mp3" } Component.onCompleted: { recorder.record() } }
QMediaCaptureSession 還為更復雜用例提供支持,譬如:圖像捕獲或視頻錄製。
除瞭 原生訪問 聲音設備, QSoundEffect 類 (和 SoundEffect QML 類型) 提供播放聲音的更抽象方式。此類允許指定 WAV 格式 文件,然後可以按低延遲播放,當有必要時。
可以調節:
Qt Multimedia 的 C++ API 提供瞭用於原生訪問音頻輸入和輸齣設施的類,允許應用程序從像麥剋風的設備接收原生數據,並將原生數據寫入揚聲器或其它設備。這些類一般不做任何音頻解碼或其它處理,但它們可以支持不同類型的原生音頻數據。
The QAudioSink 類提供原生音頻數據輸齣,而 QAudioSource 提供原生音頻數據輸入。可用硬件確定什麼音頻輸齣和輸入可用。
低級音頻類可以運轉於 2 種模式下
push
and
pull
。在
pull
模式,音頻設備的啓動是通過將它賦予
QIODevice
。對於輸齣設備,
QAudioSink
類將 pull (拉齣) 數據從
QIODevice
(使用
QIODevice::read
()) 當要求更多音頻數據時。相反,對於
pull
模式采用
QAudioSource
,當音頻數據可用時,數據將被直接寫入
QIODevice
.
在
push
模式,音頻設備提供
QIODevice
實例,可以根據需要寫入或讀取。通常,這導緻更簡單的代碼但更多的緩衝,可能影響延遲。
在某些情況下,可能想要解碼壓縮音頻文件並作進一步處理。例如,混閤多個樣本或使用自定義數字信號處理算法。 QAudioDecoder 支持解碼本地文件或數據流從 QIODevice 實例。
這裏是本地文件解碼範例:
QAudioFormat desiredFormat; desiredFormat.setChannelCount(2); desiredFormat.setSampleFormat(QAudioFormat::Int16); desiredFormat.setSampleRate(48000); QAudioDecoder *decoder = new QAudioDecoder(this); decoder->setAudioFormat(desiredFormat); decoder->setSource("level1.mp3"); connect(decoder, &QAudioDecoder::bufferReady, this, &AudioDecodingExample::readBuffer); decoder->start(); // Now wait for bufferReady() signal and call decoder->read()
The Qt Spatial Audio module provides an API for implementation sound fields in 3D space.
| 立體聲疊加聲音 | |
| 錶示具有特定格式和采樣率的一批音頻樣本 | |
| 用於透過 QMediaCaptureSession 嚮 QMediaRecorder 提供自定義音頻緩衝 | |
| 用於捕獲由 QMediaPlayer 提供的音頻數據 | |
| 實現解碼音頻 | |
| 音頻設備及其功能的有關信息 | |
| 管理 3D 聲場 | |
| 存儲音頻流參數信息 | |
| 錶示音頻的輸入通道 | |
| 定義由 QAudioEngine 定義聲場的收聽人的位置和取嚮 | |
| 錶示音頻的輸齣通道 | |
| 把音頻數據發送到音頻輸齣設備的接口 | |
| 從音頻輸入設備接收音頻數據的接口 | |
| 允許捕獲音頻/視頻內容 | |
| 用於編碼和錄製捕獲會話 | |
| 播放低延遲音效的辦法 | |
| 3D 空間中的聲音對象 | |
| 包含用於音頻類的枚舉 |
| 立體聲疊加聲音 | |
| 管理 3D 場景中的聲音對象 | |
| 用於在捕獲會話中捕獲音頻的音頻輸入 | |
| 定義由 AudioEngine 定義聲場的收聽人的位置和取嚮 | |
| 用於迴放或監視捕獲會話的音頻輸齣 | |
| 允許捕獲音頻/視頻內容 | |
| 將媒體迴放添加描述到場景 | |
| 用於編碼和錄製在 CaptureSession 中生成的媒體 | |
| Low level media playback options | |
| 提供在 QML 中播放音效方式的類型 | |
| 3D 空間中的聲音對象 | |
| 描述音頻設備 | |
| 為媒體文件提供元數據 |
| Testing the available audio devices and their configuration. | |
| Enabling audio playback using the QAudioSink class. | |
| Discovering the available devices and supported codecs. | |
| Recording audio using the QAudioSource class. | |
| Shows some of the capabilities of the spatial audio engine in Qt |