用C语言写一个写入wav文件的程序
时间: 2023-10-02 21:09:54 浏览: 87
好的,以下是一个简单的用C语言写入wav文件的程序示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char riff[4]; // "RIFF"
int32_t size; // 文件大小
char wave[4]; // "WAVE"
char fmt[4]; // "fmt "
int32_t fmt_size; // fmt 大小
int16_t format; // 编码方式,1 为 PCM
int16_t channels; // 声道数
int32_t sample_rate;// 采样率
int32_t byte_rate; // 比特率
int16_t block_align;// 块对齐
int16_t bits; // 每个采样的比特数
char data[4]; // "data"
int32_t data_size; // 数据大小
} WavHeader;
void write_wav_file(const char* filename, const short* data, int data_size, int sample_rate, int channels, int bits) {
FILE* fp = fopen(filename, "wb");
if (fp == NULL) {
printf("Failed to open file %s\n", filename);
return;
}
WavHeader wav_header = {
.riff = {'R', 'I', 'F', 'F'},
.size = 36 + data_size,
.wave = {'W', 'A', 'V', 'E'},
.fmt = {'f', 'm', 't', ' '},
.fmt_size = 16,
.format = 1,
.channels = channels,
.sample_rate = sample_rate,
.byte_rate = sample_rate * channels * bits / 8,
.block_align = channels * bits / 8,
.bits = bits,
.data = {'d', 'a', 't', 'a'},
.data_size = data_size,
};
fwrite(&wav_header, sizeof(wav_header), 1, fp);
fwrite(data, data_size, 1, fp);
fclose(fp);
}
int main() {
const char* filename = "test.wav";
int sample_rate = 44100;
int channels = 2;
int bits = 16;
int duration_seconds = 10;
int data_size = sample_rate * channels * bits / 8 * duration_seconds;
short* data = (short*)malloc(data_size);
// TODO: 填充数据
write_wav_file(filename, data, data_size, sample_rate, channels, bits);
free(data);
return 0;
}
```
这个程序需要填充数据部分,这里简单说明一下:
- `sample_rate` 表示采样率,即每秒采样的次数。通常的取值有 44100、48000 等。
- `channels` 表示声道数,通常为 1(单声道)或 2(立体声)。
- `bits` 表示每个采样点的比特数,通常为 8 或 16。
程序中的 `data` 数组是存储音频数据的地方,它的大小应该为 `sample_rate * channels * bits / 8 * duration_seconds`,其中 `duration_seconds` 表示音频的时长。每个采样点的值应该是一个 16 位有符号整数,表示音量的大小。将音量控制在 -32768 到 32767 之间即可。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![c](https://img-home.csdnimg.cn/images/20210720083646.png)