|
|
@ -30,8 +30,31 @@ |
|
|
|
|
|
|
|
namespace iflytop { |
|
|
|
namespace core { |
|
|
|
/**
|
|
|
|
* @brief WAV 文件头部信息结构体 |
|
|
|
* |
|
|
|
* 该类包含了 WAV 文件的头部信息,即在 WAV 文件中固定的 44 字节的信息。 |
|
|
|
*/ |
|
|
|
class WAVHeader { |
|
|
|
public: |
|
|
|
/**
|
|
|
|
* @brief WAV 文件头部信息的二进制格式 |
|
|
|
* |
|
|
|
* WAV 文件头部信息包含了如下字段: |
|
|
|
* - 固定为 "RIFF" 的 4 字节 chunk_id |
|
|
|
* - 文件总大小 - 8 的 4 字节 chunk_size |
|
|
|
* - 固定为 "WAVE" 的 4 字节 format |
|
|
|
* - 固定为 "fmt " 的 4 字节 subchunk1_id |
|
|
|
* - 固定为 16 的 4 字节 subchunk1_size |
|
|
|
* - 编码格式,1 表示 PCM 编码的 2 字节 audio_format |
|
|
|
* - 声道数,1 为单声道,2 为立体声的 2 字节 num_channels |
|
|
|
* - 采样率,如 44100 的 4 字节 sample_rate |
|
|
|
* - 数据传输速率,即采样率 * 声道数 * 位数 / 8 的 4 字节 byte_rate |
|
|
|
* - 数据块对齐,即每个采样点占用的字节数,如 2 表示 16 位,即 2 字节的 2 字节 block_align |
|
|
|
* - 位数,如 8、16、24、32 的 2 字节 bits_per_sample |
|
|
|
* - 固定为 "data" 的 4 字节 subchunk2_id |
|
|
|
* - 数据长度,即文件总大小 - 44 的 4 字节 subchunk2_size |
|
|
|
*/ |
|
|
|
struct WAVHeaderBinary { |
|
|
|
char chunk_id[4]; // 固定为 "RIFF"
|
|
|
|
uint32_t chunk_size; // 文件总大小 - 8
|
|
|
@ -77,19 +100,19 @@ class WAVHeader { |
|
|
|
} |
|
|
|
|
|
|
|
void dump(shared_ptr<logger> logger) { |
|
|
|
logger->info("chunk_id: {}", string(header.chunk_id, 4)); |
|
|
|
logger->info("chunk_size: {}", header.chunk_size); |
|
|
|
logger->info("format: {}", string(header.format,4)); |
|
|
|
logger->info("subchunk1_id: {}", string(header.subchunk1_id,4)); |
|
|
|
logger->info("subchunk1_size: {}", header.subchunk1_size); |
|
|
|
logger->info("audio_format: {}", header.audio_format); |
|
|
|
logger->info("num_channels: {}", header.num_channels); |
|
|
|
logger->info("sample_rate: {}", header.sample_rate); |
|
|
|
logger->info("byte_rate: {}", header.byte_rate); |
|
|
|
logger->info("block_align: {}", header.block_align); |
|
|
|
logger->info("bits_per_sample: {}", header.bits_per_sample); |
|
|
|
logger->info("subchunk2_id: {}", header.subchunk2_id); |
|
|
|
logger->info("subchunk2_size: {}", header.subchunk2_size); |
|
|
|
logger->info("chunk_id: {}", string(header.chunk_id, 4)); |
|
|
|
logger->info("chunk_size: {}", header.chunk_size); |
|
|
|
logger->info("format: {}", string(header.format, 4)); |
|
|
|
logger->info("subchunk1_id: {}", string(header.subchunk1_id, 4)); |
|
|
|
logger->info("subchunk1_size: {}", header.subchunk1_size); |
|
|
|
logger->info("audio_format: {}", header.audio_format); |
|
|
|
logger->info("num_channels: {}", header.num_channels); |
|
|
|
logger->info("sample_rate: {}", header.sample_rate); |
|
|
|
logger->info("byte_rate: {}", header.byte_rate); |
|
|
|
logger->info("block_align: {}", header.block_align); |
|
|
|
logger->info("bits_per_sample: {}", header.bits_per_sample); |
|
|
|
logger->info("subchunk2_id: {}", header.subchunk2_id); |
|
|
|
logger->info("subchunk2_size: {}", header.subchunk2_size); |
|
|
|
} |
|
|
|
|
|
|
|
WAVHeader(uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, uint32_t num_samples) { |
|
|
|