ちょっと、私はマイク入力をWAVファイルに記録するアプリケーションを作成しています。これまでは、指定したサイズのバッファを埋めるためにこれを書いていましたが、うまくいきました。今、私は任意の長さに録音できるようにしたいと思います。ここで私は何をしようとしているのです:ofstreamでバイナリデータを書き込む際の問題
-
32個の小さなオーディオのバッファ(循環バッファリング)を設定
はofstreamのでWAVファイルを起動
- - 追加0
- に設定PCMの長さのヘッダーを書きます入力バッファー
- バッファーが完了したら、そのデータをWAVファイルに追加してヘッダーを更新します。ユーザーがファイルに残りのバッファを書き、「停止」と近い
それは一種のファイルは、ヘッダとファイルサイズ(正しい長さに出てきていることで動作しているヒットするとバッファ
// 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);
}
ここでバッファを受け取るコードは次のとおり
ここで(ヘッダ内の)コードが使用ここ
// File writing
ofstream mFile;
WAVFILEHEADER mFileHeader;
int16_t * mPcmBuffer;
int32_t mPcmBufferPosition;
int32_t mPcmBufferSize;
uint32_t mPcmTotalSize;
bool mRecording;
ファイルを準備するコードであり、いくつかの変数です。これは、受信データが正しいことを前提としています - はになりますが、そうではないと判断していません。
// 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;
}
それがファイルに追加取得不良データにつながるように見えるここに何があるのならば、私に知らせてください。そうでない場合は、入力データ(コールバック内)を3回確認します。このデータはでなければなりません。なぜなら、それを大きなバッファ(例えば2分)にコピーしてから保存すると機能するからです。
この[mPcmBufferPosition * = sizeof(int16_t); ]はタイプミスのように見えます。それは+ =であるはずですか? –