我正在尝试创建一种存储wav文件元数据的软件。
这里是MWE:
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
FILE * READ_WAV_FILE;
struct WAV_FILE_HEADER{
char ChunkID[4]; // RIFF
uint32_t ChunkSize;
char Format[4]; // WAVE
char Subchunk1ID[4]; // fmt
uint32_t Subchunk1Size;
uint16_t AudioFormat;
uint16_t NumChannels;
uint32_t SampleRate;
uint32_t ByteRate;
uint16_t BlockAlign;
uint16_t BitsPerSample;
};
struct WAV_FILE_HEADER WAV_FILE_0;
void print_wav_struct(){
printf("ChunkID: %s\n", WAV_FILE_0.ChunkID);
printf("ChunkSize %u\n", WAV_FILE_0.ChunkSize);
printf("Format %s\n", WAV_FILE_0.Format);
printf("Subchunk1ID %s\n", WAV_FILE_0.Subchunk1ID);
printf("Subchunk1Size %u\n", WAV_FILE_0.Subchunk1Size);
printf("AudioFormat %hu\n", WAV_FILE_0.AudioFormat);
printf("NumChannels %hu\n", WAV_FILE_0.NumChannels);
printf("SampleRate %u\n", WAV_FILE_0.SampleRate);
printf("ByteRate %u\n", WAV_FILE_0.ByteRate);
printf("BlockAlign %hu\n", WAV_FILE_0.BlockAlign);
printf("BitsPerSample %hu\n", WAV_FILE_0.BitsPerSample);
}
int read_wavfile(){
READ_WAV_FILE = fopen("read.wav", "rb");
fseek(READ_WAV_FILE,0,SEEK_SET);
fread(&WAV_FILE_0,sizeof(WAV_FILE_0),1,READ_WAV_FILE);
fclose(READ_WAV_FILE);
return 0;
}
int main(){
if (read_wavfile()){
printf("Something went wrong\n");
return -1;
}
print_wav_struct();
return 0;
}
这里的问题是“ ChunkID”,“ Format”和“ Subchunk1ID”的输出:
ChunkID: RIFFF
ChunkSize 48824390
Format WAVEfmt
Subchunk1ID fmt
Subchunk1Size 16
AudioFormat 1
NumChannels 2
SampleRate 48000
ByteRate 192000
BlockAlign 4
BitsPerSample 16
仅那些字符串会受到此问题的影响。整数不是。
““ ChunkID”应该只是“ RIFF”,“格式”应该只是“ WAVE”,“ Subchunk1ID”应该只是“ fmt”。
读取文件时我出了什么问题?
对不起,冗长的代码很荒谬,但这是我发现的最少的唯一方法。
fread(&WAV_FILE_0,sizeof(WAV_FILE_0),1,READ_WAV_FILE);