1 .wav格式说明
一. RIFF 概念
二. WAV 文件格式
typedef struct
{
WAVEFORMAT wf; /波形格式;
WORD wBitsPerSample; //WAVE 文件的采样大小;
} PCMWAVEFORMAT;
//WAVEFORMAT 结构定义如下:
typedef struct
{
WORD wFormatag; //编码格式,包括 WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM 等
WORD nChannls; //声道数,单声道为 1,双声道为 2;
DWORD nSamplesPerSec; //采样频率;
DWORD nAvgBytesperSec; //每秒的数据量;
WORD nBlockAlign; //块对齐;
} WAVEFORMAT;
2 c语言读写.wav文件示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(1)
typedef struct {
char riff[4]; // "RIFF"
unsigned int size; // Size of the file
char wave[4]; // "WAVE"
char fmt[4]; // "fmt "
unsigned int fmt_size;// Size of format
unsigned short audio_format; // Audio format
unsigned short num_channels; // Number of channels
unsigned int sample_rate; // Sample rate
unsigned int byte_rate; // Byte rate
unsigned short block_align; // Block align
unsigned short bits_per_sample; // Bits per sample
char data[4]; // "data"
unsigned int data_size; // Size of data
} WAVHeader;
void read_wav(const char *filename) {
FILE *file = fopen(filename, "rb");
if (!file) {
perror("Unable to open file");
return;
}
WAVHeader header;
fread(&header, sizeof(WAVHeader), 1, file);
printf("RIFF: %.4s\n", header.riff);
printf("WAVE: %.4s\n", header.wave);
printf("Format: %.4s\n", header.fmt);
printf("Channels: %hu\n", header.num_channels);
printf("Sample Rate: %u\n", header.sample_rate);
printf("Bits per Sample: %hu\n", header.bits_per_sample);
printf("Data Size: %u\n", header.data_size);
// Read audio data
short *data = malloc(header.data_size);
fread(data, header.data_size, 1, file);
fclose(file);
// Example: Print first 10 samples
for (int i = 0; i < 10 && i < header.data_size / 2; i++) {
printf("Sample %d: %d\n", i, data[i]);
}
free(data);
}
void write_wav(const char *filename, short *data, unsigned int data_size, int sample_rate, int num_channels) {
FILE *file = fopen(filename, "wb");
if (!file) {
perror("Unable to open file");
return;
}
WAVHeader header;
strncpy(header.riff, "RIFF", 4);
header.size = 36 + data_size;
strncpy(header.wave, "WAVE", 4);
strncpy(header.fmt, "fmt ", 4);
header.fmt_size = 16;
header.audio_format = 1; // PCM
header.num_channels = num_channels;
header.sample_rate = sample_rate;
header.byte_rate = sample_rate * num_channels * (16 / 8);
header.block_align = num_channels * (16 / 8);
header.bits_per_sample = 16;
strncpy(header.data, "data", 4);
header.data_size = data_size;
fwrite(&header, sizeof(WAVHeader), 1, file);
fwrite(data, data_size, 1, file);
fclose(file);
}
int main() {
const char *input_filename = "input.wav";
const char *output_filename = "output.wav";
read_wav(input_filename);
// Here you would modify `data` as needed
short sample_data[10] = {0}; // Example data
write_wav(output_filename, (short *)sample_data, sizeof(sample_data), 44100, 1);
return 0;
}
gcc -o wav_example wav_example.c
本文内容仅代表作者观点,不代表平台观点。
如有任何异议,欢迎联系我们。
如有侵权,请联系删除。
2021年的第一场雪!英特尔2020年Q4财报解读
利用硬件辅助验证工具加速功能仿真
博文:裸片尺寸和光罩难题——光刻扫描仪吞吐量的成本模型
博文速递:Race condition in digital circuits