2014-05-22 84 views
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); 

回答

1

變化,你打開該文件,以類似

std::ofstream stream(outFile, std::ios::out | std::ios::binary | std::ios::app); 

std::ios::app國旗代表追加行的一行代碼。有關更多詳細信息,請參閱文檔here

+0

它可以工作,但是看起來我有點天真,這會寫入數據,但.wav文件不會看到差異,因爲它也會重寫頭文件。 是否有可能用最新的信息重寫標題,所以不是說(它是2ms反覆),它會追加2ms,4ms,6ms等? (2ms只是一個數字*) – Zerowalker

+0

首先回讀wav文件,並用新數據和更新的標題信息完全覆蓋文件。 – jasal

+0

在使用'writeWAVData'函數的上下文中知道這一點也很好。如果你從同一個應用程序中使用它來添加wav數據並從中創建一個文件,你可以先將它寫入一個內存緩衝區,並在添加完成後創建該文件。 – jasal

相關問題