2016-12-27 130 views
1

我正在嘗試監視音頻輸入並將音頻記錄到文件,但只有當超過閾值時纔會記錄。在Qt中錄製似乎有兩個主要選項; QAudioRecorderQAudioInputQt:API將原始QAudioInput數據寫入文件就像QAudioRecorder

長話短說:我試圖找到可以從QAudioInput讀取原始音頻採樣數據,並將其記錄到文件中,就像QAudioRecorder這個API,但奇怪的是它似乎並不存在。舉一個例子,QAudioRecorder的設置會像下面的(但不是指定與setAudioInput()一個輸入設備傳遞給它的採樣字節):

QAudioEncoderSettings audioSettings; 
QAudioRecorder recorder = new QAudioRecorder; 
audioSettings.setCodec("audio/PCM"); 
audioSettings.setQuality(QMultimedia::HighQuality); 
recorder.setEncodingSettings(audioSettings); 
recorder.setContainerFormat("wav"); 
recorder.setOutputLocation(QUrl::fromLocalFile("/tmp/test.wav")); 
recorder.setAudioInput("default"); 
recorder.record(); 

我使用QAudioInput因爲我需要訪問原始樣本。 QAudioInput的問題在於,Qt似乎沒有提供一種簡單的方法,將我從QAudioInput中獲得的原始樣本提取出來,並將它們編碼爲沿途編碼的文件。 QAudioRecorder做得很好,但不能將原始樣本送入QAudioRecorder;您只需告訴它要記錄哪個設備以及如何存儲它。

注意我嘗試使用QAudioInputQAudioRecorder在一起 - QAudioInput的原始訪問和QAudioRecorder每當我需要記錄,但有兩個主要問題:A)只有這些人能在同一時間內閱讀給定的設備。 B)我想在超過閾值之前及之前記錄數據,而不是超過閾值之後。

+0

你解決了嗎?我將嘗試使用'QAudioSystemPlugin'製作虛擬音頻設備。 – Velkan

+0

〜分類。我找到了一個適合我的折中解決方案。我會盡快將解釋發佈爲答案。 – spinkus

回答

0

我結束了使用QAudioRecorder + QAudioProbe。有一對夫婦的限制,但:

首先附着QAudioProbe只有工作,如果QAudioRecorder實際上是記錄,所以我只好在QAudioRecorder編寫一個包裝通過切換輸出設備來開啓/關閉記錄|從actual_file |的/ dev /空值。

其次,正如我所說的「我想記錄的數據在剛剛超過閾值之前,而不是超過閾值後」。那麼,我必須妥協。探頭用於檢測記錄條件,但無法將來自探頭的數據填充到記錄儀中。我的意思是,我猜你可以記錄到處於空閒狀態的緩衝區文件,並以某種方式預先部分數據......但複雜性對我來說並不值得。

Aside;有another issueQAudioRecorder,這促使我寫一個包裝它。基本上我發現QAudioRecorder::stop()有時會無限期掛起。爲了解決這個問題,我不得不分配一臺錄音機並刪除它,並用每個新錄音啓動一個新錄音機。

+0

嗯,我根本沒有音頻設備...所以我需要更長的時間。 – Velkan