簡體   English   中英

實時記錄/轉換AUDIO數據到WAV

[英]Record/Convert AUDIO data to WAV in Real-time

關於音頻信號處理,我是新手。

目前,我已將設備連接到PC,該設備會從麥克風/播放軌道向我發送音頻數據。 我已經使用Steinberg ASIO SDK 2.3創建了主機應用程序,該應用程序連接到設備,並在重復回調中返回原始數據。 信號為24位,我可以選擇任意頻率,例如44100 hZ,2pan的單通道。 我也將此信號轉換為<-1.0,1.0>的兩倍,因為我正在對其進行一些信號處理。

我現在想做的就是向主機添加錄音功能。 例如,單擊按鈕時,傳入的數據將連續轉換為WAV文件,當我單擊其他按鈕時,它將停止並保存。

我已經閱讀過有關WAV文件,文件格式,比特流格式(RIFF)的信息,並且以某種方式對WAV文件的外觀有了一個整體的了解。 我還檢查了很多論壇主題,stackoverflow的主題或代碼項目的帖子,以及到處都可以找到與主題相關的內容,但是我不知道如何實時進行錄制。 我發現很多代碼都是關於對數據數組進行修改后將其轉換為WAV的。 我想進行不斷的轉換,並讓WAV文件追加/擴展,直到我告訴它停止為止。

例如,我可以以某種方式修改它嗎?

#include <fstream>

template <typename T>
void write(std::ofstream& stream, const T& t) {
  stream.write((const char*)&t, sizeof(T));
}

template <typename T>
void writeFormat(std::ofstream& stream) {
  write<short>(stream, 1);
}

template <>
void writeFormat<float>(std::ofstream& stream) {
  write<short>(stream, 3);
}

template <typename SampleType>
void writeWAVData(
  char const* outFile,
  SampleType* buf,
  size_t bufSize,
  int sampleRate,
  short channels)
{
  std::ofstream stream(outFile, std::ios::binary);
  stream.write("RIFF", 4);
  write<int>(stream, 36 + bufSize);
  stream.write("WAVE", 4);
  stream.write("fmt ", 4);
  write<int>(stream, 16);
  writeFormat<SampleType>(stream);                                // Format
  write<short>(stream, channels);                                 // Channels
  write<int>(stream, sampleRate);                                 // Sample Rate
  write<int>(stream, sampleRate * channels * sizeof(SampleType)); // Byterate
  write<short>(stream, channels * sizeof(SampleType));            // Frame size
  write<short>(stream, 8 * sizeof(SampleType));                   // Bits per sample
  stream.write("data", 4);
  stream.write((const char*)&bufSize, 4);
  stream.write((const char*)buf, bufSize);
}

並以某種方式在回調中:

writeWAVData("mySound.wav", mySampleBuffer, mySampleBufferSize, 44100, 1);

對於任何提示/鏈接/建議/幫助形式,我深表感謝。

用例和在線代碼之間的區別在於,在用例中,您事先不知道文件將要存儲多長時間,因為您不知道用戶何時會使用該文件。按停止按鈕。

解決此問題的方法是像往常一樣先寫出WAV標頭,但現在不必擔心為特定文件大小的字段(即“ RIFF”之后的字段和“數據”)。 您可以暫時將這些字段設置為零。

然后在接收到音頻樣本時將其寫出,即將它們添加到文件末尾。

最后,在用戶按下Stop並要關閉文件之后,您需要返回並用正確的值覆蓋這兩個標頭字段。 您現在就可以執行此操作,因為此時您知道將多少字節的音頻數據寫入文件中。 完成此操作后,文件應格式正確且可用。 您可以使用例如ofstream :: seekp(fieldOffset,ios_base :: beg)從文件頂部查找適當的偏移量以查找需要修改的字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM