c++将实时接收的pcm二进制裸数据转换为wav格式存储
时间: 2023-09-18 20:06:38 浏览: 93
要将实时接收的PCM二进制裸数据转换为WAV格式存储,可以按照以下步骤进行:
1. 创建WAV文件头
WAV文件头包含WAV文件的格式信息,需要根据实际情况进行填写。可以参考以下代码:
```c++
struct WavHeader {
char riff[4]; // "RIFF"
uint32_t size; // 文件总大小(不包括riff和size字段)
char wave[4]; // "WAVE"
char fmt[4]; // "fmt "
uint32_t fmt_size; // fmt块大小
uint16_t audio_format; // 音频格式,1表示PCM
uint16_t channels; // 声道数
uint32_t sample_rate; // 采样率
uint32_t byte_rate; // 每秒字节数
uint16_t block_align; // 数据块对齐字节数
uint16_t bits_per_sample; // 每个采样点占用的位数
char data[4]; // "data"
uint32_t data_size; // 数据块大小
};
```
2. 每次接收到PCM数据后,将其写入WAV文件中。
可以使用C++中的文件流来写入数据,例如:
```c++
std::ofstream out_file("output.wav", std::ios::app | std::ios::binary);
out_file.write(reinterpret_cast<const char*>(pcm_data), pcm_data_size);
```
3. 在结束时修改WAV文件头中的大小信息,并关闭文件。
可以参考以下代码:
```c++
// 修改WAV文件头中的大小信息
wav_header.size = sizeof(WavHeader) - 8 + pcm_data_size;
wav_header.data_size = pcm_data_size;
out_file.seekp(0);
out_file.write(reinterpret_cast<const char*>(&wav_header), sizeof(WavHeader));
out_file.close(); // 关闭文件
```
完整代码示例:
```c++
#include <fstream>
#include <cstdint>
struct WavHeader {
char riff[4]; // "RIFF"
uint32_t size; // 文件总大小(不包括riff和size字段)
char wave[4]; // "WAVE"
char fmt[4]; // "fmt "
uint32_t fmt_size; // fmt块大小
uint16_t audio_format; // 音频格式,1表示PCM
uint16_t channels; // 声道数
uint32_t sample_rate; // 采样率
uint32_t byte_rate; // 每秒字节数
uint16_t block_align; // 数据块对齐字节数
uint16_t bits_per_sample; // 每个采样点占用的位数
char data[4]; // "data"
uint32_t data_size; // 数据块大小
};
int main() {
// 初始化WAV文件头信息
WavHeader wav_header = {};
std::memcpy(wav_header.riff, "RIFF", 4);
std::memcpy(wav_header.wave, "WAVE", 4);
std::memcpy(wav_header.fmt, "fmt ", 4);
std::memcpy(wav_header.data, "data", 4);
wav_header.fmt_size = 16;
wav_header.audio_format = 1;
wav_header.channels = 1;
wav_header.sample_rate = 16000;
wav_header.bits_per_sample = 16;
wav_header.block_align = wav_header.channels * wav_header.bits_per_sample / 8;
wav_header.byte_rate = wav_header.sample_rate * wav_header.block_align;
// 打开输出文件
std::ofstream out_file("output.wav", std::ios::binary);
out_file.write(reinterpret_cast<const char*>(&wav_header), sizeof(WavHeader));
// 循环接收PCM数据并写入文件
while (true) {
// 模拟从网络中接收到PCM数据
uint8_t pcm_data[1024] = {0};
int pcm_data_size = 1024;
// 写入PCM数据
out_file.write(reinterpret_cast<const char*>(pcm_data), pcm_data_size);
// 如果需要结束,跳出循环
if (true) {
break;
}
}
// 修改WAV文件头中的大小信息
wav_header.size = sizeof(WavHeader) - 8 + pcm_data_size;
wav_header.data_size = pcm_data_size;
out_file.seekp(0);
out_file.write(reinterpret_cast<const char*>(&wav_header), sizeof(WavHeader));
out_file.close(); // 关闭文件
return 0;
}
```
阅读全文