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

标签 c++ audio wav riff

我意识到忽略这个想法对我来说是不好的,因为我还没有阅读任何关于 number of channelsbits per sample 的文章。我的理由是我不确定 2 channel 8 位 PCM 文件的样本会是什么样子。

1 个样本 = 1 个 channel 吗?或 1 个样本 = 4 位(左)+ 4 位(右)

上下文: 我正在编写一个读取 WAV 文件的程序,我突然想到,如果我遇到 8 位 PCM WAV 文件,并且我的代码以这种方式读取(见下文),那么我的程序将无法正确读取多 channel 8位 PCM WAV 文件。


// read actual audio data after obtaining
// the headers
// audioData is a vector of vectors (1 vector per channel)
uint32_t temp;
while( !feof(wavFile) ) {
    for(uint16_t i = 0; i < numChannels; i++) {
        temp = 0;
        fread(&temp,sizeof(uint8_t),1,wavFile);
        audioData.at(i).push_back(temp); 
    }
}

最佳答案

通常描述 WAV 音频数据格式的结构在 MSDN 中有描述:WAVEFORMATEX structure :

  • PCM 音频的“样本”是一个数据 block ,其中包括所有 channel
  • nBlockAlign 值为样本对应 block 的大小,以字节为单位
  • 样本以特定的固定速率进行,由 nSamplesPerSec 值定义
  • 每个样本 block 由 nChannels 个值组成,每个 wBitsPerSample

也就是说,每个样本 8 位的双 channel 文件对每一秒的音频数据都有 nSamplesPerSec 对,每对包括两个 8 位值的每个 channel 。

(here 是此结构存在于 WAV 文件中的示例 - 虽然这是 24 位/样本的更复杂情况,但您应该明白了)。

关于c++ - 8 位(每个样本的位数)PCM WAV 文件是否可以包含多个 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35825617/

相关文章:

C# 获取音频进程列表

python - 通过fft查找wav文件的频率幅度和相位

c++ - 微小的传输最终交织在一起,我真的需要解析缓冲区吗?

ios - Audio Kit iOS 检测短麦克风输入的音高/频率,例如水龙头

ios - 音频数据的均衡器

java pcm转wav

WAV 音频格式 : MPEG3 to PCM

c++ - Qt5 C++ 将触发的 QAction 连接到成员函数

c++ - 提供类似的默认特殊成员函数是一种不好的做法吗?

C++ 模板推导不起作用