QFileをバックボーンとして使用して、WAVレコーダを作成しています。しかし、私は私のWav構造体を埋めると、それを私のQFileに書き込もうとすると、 "RIFF"しか書き込まれない、私はUNIXのod -cb 1.wav
でそれを見た。ここsamleコードは次のとおりです。次のようにQFile WAVヘッダを書き込むと、4バイトのデータしか書き込まれない
wavwriter.cpp
Wav::Wav(const char *fname, QFile* parent)
: QFile(fname, parent),
m_fname(fname)
{
setFileName(fname);
bool res = this->open(QIODevice::ReadWrite);
if (res) {
std::cout << "File opened for RW\n";
}
}
Wav::~Wav()
{
}
void Wav::writeHeader(const WavHdr* hdr)
{
write((char*)hdr);
flush();
}
void Wav::appendData(const QByteArray &data)
{
m_data.append(data);
}
QByteArray Wav::getWavData()
{
return m_data;
}
と使用方法は次のとおりです。
WavHdr hdr;
hdr.bits_per_sample = 8;
hdr.riff[0] = 'R';
hdr.riff[1] = 'I';
hdr.riff[2] = 'F';
hdr.riff[3] = 'F';
hdr.sample_rate = 8;
hdr.fmt[0] = 'f';
hdr.fmt[1] = 'm';
hdr.fmt[2] = 't';
m_wavs[i]->writeHeader(&hdr);
WavHdrは次のセットアップを持っています
struct WavHdr
{
char riff[4];
qint32 file_size;
char wave[4];
char fmt[4];
char len[3];
qint16 type;
quint16 format;
qint32 sample_rate;
qint32 sr_bs_channs;
quint8 bits_per_sample;
char data[4];
qint32 fsize;
};
。それがうまくいくと、それはあなたのコードが正しいからではなく、あなたがラッキーだからです。それは反パターンです。これをしないでください。また、 'flush()'は不要です。 –