0
正如標題saidw,我想幫助改變此代碼,而不是寫入緩衝區等文件,我想追加,所以它創建的文件第一次,然後如果文件存在,它會追加它。將此代碼更改爲追加而不是覆蓋(.Wav)
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("test.wav", mixBuffer.Array(), audioSampleSize, 48000, 1);
它可以工作,但是看起來我有點天真,這會寫入數據,但.wav文件不會看到差異,因爲它也會重寫頭文件。 是否有可能用最新的信息重寫標題,所以不是說(它是2ms反覆),它會追加2ms,4ms,6ms等? (2ms只是一個數字*) – Zerowalker
首先回讀wav文件,並用新數據和更新的標題信息完全覆蓋文件。 – jasal
在使用'writeWAVData'函數的上下文中知道這一點也很好。如果你從同一個應用程序中使用它來添加wav數據並從中創建一個文件,你可以先將它寫入一個內存緩衝區,並在添加完成後創建該文件。 – jasal