【问题标题】:Changing this code to Append instead of Overwrite (.Wav)将此代码更改为追加而不是覆盖 (.Wav)
【发布时间】:2014-05-22 12:41:50
【问题描述】:

正如标题所说,我希望帮助我更改此代码,而不是将缓冲区等写入文件,我希望它附加,所以它第一次创建文件,然后如果文件存在,它将附加它。

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);

【问题讨论】:

    标签: c++


    【解决方案1】:

    将打开文件的行更改为类似

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

    std::ios::app 标志代表 追加。有关详细信息,请参阅文档here

    【讨论】:

    • 它确实有效,但似乎我有点天真,这将写入数据,但 .wav 文件不会看到差异,因为它也会重写标题。是否有可能用最新的信息重写标题,而不是说(一遍又一遍的 2 毫秒),它会追加 2 毫秒、4 毫秒、6 毫秒等? (2ms只是一个数字*)
    • 先读回wav文件,用新数据和更新的头信息完全覆盖文件。
    • 最好知道您在什么情况下使用writeWAVData 函数。如果您在同一个应用程序中使用它来附加 wav 数据并从中创建文件,您也可以先将其写入内存缓冲区,然后在附加完成后创建文件。
    • 你能给出一个方法吗?如果持续时间设置在某个地方,我也可以每次都添加它,因为添加的持续时间应该始终相同。 Wav 数据来自缓冲区,来自麦克风或桌面,我认为写入内存缓冲区不是一个好主意,因为录音可能很长。
    • 只需实现一个readWAVData 函数,该函数打开文件以读取并读回您在writeWAVData 中写出的所有内容。将回读缓冲区与新数据相结合,添加新旧样本缓冲区的大小,并使用writeWAVData 用更新的内容覆盖文件。当然,您必须删除 std::ios::app 标志。
    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 2016-06-19
    • 2012-07-13
    • 1970-01-01
    • 2017-09-19
    • 2020-12-16
    • 2021-09-18
    相关资源
    最近更新 更多