c++ - 处理 .wav 文件期间输出失真

标签 c++ endianness riff

我想处理一个 .wav 文件,例如降低振幅; 当我使用以下代码时,输​​出会失真,这并不令人愉快。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    char* wav_mem;
    ifstream wav_file;
    wav_file.open("1.wav", ios::binary | ios::ate);
    int file_size = wav_file.tellg();
    wav_mem = new char[file_size];
    wav_file.seekg(0, ios::beg);
    wav_file.read(wav_mem, file_size);
    int16_t sample = 0;
    wav_file.close();
    for(int i = 44; i <= file_size; i += 2)
    {   
        sample = ((wav_mem[i + 1] << 8) | (wav_mem[i]));
        sample = (int16_t)(sample * 0.5);
        wav_mem[i] = sample;
        wav_mem[i+1] = (sample >> 8);
    }
    ofstream out_file;
    out_file.open("out.wav", ios::binary);
    out_file.write(wav_mem, file_size);
}

如何修复失真?

最佳答案

假设您对 .wav 文件本身的操作是正确的(否则我不太了解它是否是问题所在)一些潜在的缺陷可能是:

  1. int 中收集 tellg 的输出可能会导致溢出。也许使用 auto 来获得正确的类型?
  2. wav_mem[i+1] = (sample >> 8);i == file_size 在循环中可能导致溢出访问(超出长度wav_mem) ?

编辑: 实际上,由于 wav_mem = new char[file_size]; 行,您只能以定义的方式访问 [0, file_size) 索引。所以当 i = file_size 时,wav_mem[i]wav_mem[i+1] 都将是 UB。

关于c++ - 处理 .wav 文件期间输出失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57709983/

相关文章:

c++ - 使用 C++ 读取 wav 文件时出错

c++ - 使用 make 将 .o 文件移动到单独的目录

c++ - 如何使用 MultiByteToWideChar?

hash - 如何将短语和单词转换为 MD5 哈希值?

c# - .Wav Speex header 内容的问题

c++ - 8 位(每个样本的位数)PCM WAV 文件是否可以包含多个 channel ?

c++ - 具有 C++ Boost 线程的体系结构 x86_64 的 undefined symbol

c++ - MOG2 背景扣除参数

c++ - 如何将字节序转换为位数组

c++ - 句柄的可移植位字段