Browse Source

改进Wavheader

master
zhaohe 2 years ago
parent
commit
12d6063d39
  1. 32
      core/components/audio/wavheader.hpp

32
core/components/audio/wavheader.hpp

@ -50,10 +50,11 @@ class WAVHeader {
WAVHeaderBinary header;
public:
WAVHeader(uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, uint32_t num_samples) {
WAVHeader() {}
void initialize(uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, uint32_t wavbinsize) {
// 填充 RIFF 头
strcpy(header.chunk_id, "RIFF");
header.chunk_size = num_samples * num_channels * bits_per_sample / 8 + 44;
header.chunk_size = wavbinsize + 44 - 8;
strcpy(header.format, "WAVE");
// 填充 fmt 子块
@ -62,15 +63,38 @@ class WAVHeader {
header.audio_format = 1; // PCM 编码
header.num_channels = num_channels;
header.sample_rate = sample_rate;
header.bits_per_sample = bits_per_sample;
header.byte_rate = sample_rate * num_channels * bits_per_sample / 8;
header.block_align = num_channels * bits_per_sample / 8;
header.bits_per_sample = bits_per_sample;
// 填充 data 子块
strcpy(header.subchunk2_id, "data");
header.subchunk2_size = num_samples * num_channels * bits_per_sample / 8;
header.subchunk2_size = wavbinsize;
}
void resize(uint32_t wavbinsize) {
header.chunk_size = wavbinsize + 44 - 8;
header.subchunk2_size = wavbinsize;
}
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);
}
WAVHeader(uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, uint32_t num_samples) {
initialize(sample_rate, bits_per_sample, num_channels, num_samples);
}
uint8_t* data() { return (uint8_t*)&header; }
size_t size() { return sizeof(header); }
};

Loading…
Cancel
Save