📜  如何在 C++ 中读取 wav 文件(1)

📅  最后修改于: 2023-12-03 15:38:13.961000             🧑  作者: Mango

如何在 C++ 中读取 wav 文件

在 C++ 中读取 wav 文件需要使用一些库和一些基本的知识。本文将介绍如何使用 C++ 读取 wav 文件,包括如何打开文件、读取文件头、读取声音数据等。

打开 wav 文件

在 C++ 中打开 wav 文件需要使用到 <fstream> 头文件中的 ifstream 类。我们可以通过以下方式来打开 wav 文件:

#include <fstream>

std::ifstream file("audio.wav", std::ios::binary);

在这个例子中,我们打开了 audio.wav 文件,并将打开模式设置为 std::ios::binary。这是因为 wav 文件是二进制文件,需要以二进制的形式读取。

读取 wav 文件头

wav 文件有一个固定的文件头,其中包含了很多有用的信息,如采样率、声道数、数据格式等。我们需要读取这个文件头才能准确地读取声音数据。以下是 wav 文件头的结构:

struct wav_header {
  char chunk_id[4];
  uint32_t chunk_size;
  char format[4];
  char subchunk1_id[4];
  uint32_t subchunk1_size;
  uint16_t audio_format;
  uint16_t num_channels;
  uint32_t sample_rate;
  uint32_t byte_rate;
  uint16_t block_align;
  uint16_t bits_per_sample;
  char subchunk2_id[4];
  uint32_t subchunk2_size;
};

我们可以通过以下代码来读取 wav 文件头:

wav_header header;
file.read((char*)&header, sizeof(wav_header));
读取声音数据

在 wav 文件中,声音数据紧挨着文件头存储。我们可以通过以下代码来读取声音数据:

const int DATA_SIZE = header.subchunk2_size;
std::vector<char> data(DATA_SIZE);
file.read(data.data(), DATA_SIZE);

注意,我们使用了 std::vector 类来存储声音数据。这是因为 wav 文件中的数据是按字节存储的,我们需要将它们转换为合适的类型。以下代码将 wav 文件中的声音数据转换为 short 类型:

const short* data_short = reinterpret_cast<const short*>(data.data());
const int num_samples = DATA_SIZE / sizeof(short);
完整代码
#include <fstream>
#include <cstdint>
#include <vector>

struct wav_header {
  char chunk_id[4];
  uint32_t chunk_size;
  char format[4];
  char subchunk1_id[4];
  uint32_t subchunk1_size;
  uint16_t audio_format;
  uint16_t num_channels;
  uint32_t sample_rate;
  uint32_t byte_rate;
  uint16_t block_align;
  uint16_t bits_per_sample;
  char subchunk2_id[4];
  uint32_t subchunk2_size;
};

int main() {
  std::ifstream file("audio.wav", std::ios::binary);

  wav_header header;
  file.read((char*)&header, sizeof(wav_header));

  const int DATA_SIZE = header.subchunk2_size;
  std::vector<char> data(DATA_SIZE);
  file.read(data.data(), DATA_SIZE);

  const short* data_short = reinterpret_cast<const short*>(data.data());
  const int num_samples = DATA_SIZE / sizeof(short);

  return 0;
}

以上是在 C++ 中读取 wav 文件的基本过程,需要注意的是,不同操作系统上,wav 文件的结构可能会有所不同,需要根据实际情况进行调整。