マイク入力を WAV ファイルに記録するアプリケーションを作成しています。以前は、指定されたサイズのバッファを埋めるためにこれを書いていましたが、うまくいきました。さて、任意の長さに録音できるようにしたいと思います。これが私がやろうとしていることです:
- 32 個の小さなオーディオ バッファをセットアップする (循環バッファリング)
- ofstream で WAV ファイルを開始 -- PCM の長さを 0 に設定してヘッダーを書き込みます
- 入力にバッファを追加する
- バッファが完了すると、そのデータが WAV ファイルに追加され、ヘッダーが更新されます。バッファをリサイクルする
- ユーザーが「停止」を押したら、残りのバッファをファイルに書き込んで閉じます
ファイルが正しい長さ(ヘッダーとファイルサイズが正しい)になるという点で、それは一種の機能です。ただし、データは地獄のように不安定です。私が言ったことの類似性を理解することができます - そしてタイミングは正しいです - しかし、この反復的な歪みのブロックがあります. 基本的に、データの半分だけがファイルに取り込まれているように聞こえます。
コードが使用するいくつかの変数を次に示します (ヘッダー内)。
// File writing
ofstream mFile;
WAVFILEHEADER mFileHeader;
int16_t * mPcmBuffer;
int32_t mPcmBufferPosition;
int32_t mPcmBufferSize;
uint32_t mPcmTotalSize;
bool mRecording;
ファイルを準備するコードは次のとおりです。
// Start recording audio
void CaptureApp::startRecording()
{
// Set flag
mRecording = true;
// Set size values
mPcmBufferPosition = 0;
mPcmTotalSize = 0;
// Open file for streaming
mFile.open("c:\my.wav", ios::binary|ios::trunc);
}
バッファを受け取るコードは次のとおりです。これは、受信データが正しいことを前提としています。正しいはずですが、正しくない可能性も排除していません。
// Append file buffer to output WAV
void CaptureApp::writeData()
{
// Update header with new PCM length
mPcmBufferPosition *= sizeof(int16_t);
mPcmTotalSize += mPcmBufferPosition;
mFileHeader.bytes = mPcmTotalSize + sizeof(WAVFILEHEADER);
mFileHeader.pcmbytes = mPcmTotalSize;
mFile.seekp(0);
mFile.write(reinterpret_cast<char *>(&mFileHeader), sizeof(mFileHeader));
// Append PCM data
if (mPcmBufferPosition > 0)
{
mFile.seekp(mPcmTotalSize - mPcmBufferPosition + sizeof(WAVFILEHEADER));
mFile.write(reinterpret_cast<char *>(&mPcmBuffer), mPcmBufferPosition);
}
// Reset file buffer position
mPcmBufferPosition = 0;
}
そして、これはファイルを閉じるコードです:
// Stop recording
void CaptureApp::stopRecording()
{
// Save remaining data
if (mPcmBufferSize > 0)
writeData();
// Close file
if (mFile.is_open())
{
mFile.flush();
mFile.close();
}
// Turn off recording flag
mRecording = false;
}
ファイルに不正なデータが追加される可能性があると思われるものがあれば、お知らせください。そうでない場合は、(コールバックで) 入力データをトリプル チェックします。このデータは、より大きなバッファー (たとえば 2 分) にコピーしてから保存すると機能するため、適切なはずです。