From c8cd4807bfb283471475b180e14452b88758f63d Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 16 Mar 2023 11:33:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BAwavheader=E6=B7=BB=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/components/audio/wavheader.hpp | 49 +++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/core/components/audio/wavheader.hpp b/core/components/audio/wavheader.hpp index 47a1e1f..e7f48ea 100644 --- a/core/components/audio/wavheader.hpp +++ b/core/components/audio/wavheader.hpp @@ -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->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) {