我需要从波形文件中读取 header 变量并显示它们是什么。我正在使用以下代码,但我的输出数字太大。我已经寻找解决方案几个小时了。非常感谢您的帮助!谢谢。我从 https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ 获取了波形声音文件格式
输出:
Wav文件头信息:
文件大小 3884 字节
RIFF 标题 RIFF
WAVE header WAVE
子 block 1ID fmt
block 大小(基于使用的位数)604962816
子 block 1 尺寸 268435456
采样率288030720
每个样本位数 2048
音频格式 256
channel 数 2048
字节率288030720
子 block 2ID
子 block 2大小1684108385
来源如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct WAV_HEADER
{
char RIFF[4];
int ChunkSize;
char WAVE[4];
char fmt[4];
int Subchunk1Size;
short int AudioFormat;
short int NumOfChan;
int SamplesPerSec;
int bytesPerSec;
short int blockAlign;
short int bitsPerSample;
int Subchunk2Size;
char Subchunk2ID[4];
}wav_hdr;
int getFileSize(FILE *inFile);
int main(int argc,char *argv[])
{
//check startup conditions
if(argc >= 2); //we have enough arguments -- continue
else { printf("\nUSAGE: program requires a filename as an argument -- please try again\n"); exit(0);}
wav_hdr wavHeader;
FILE *wavFile;
int headerSize = sizeof(wav_hdr),filelength = 0;
wavFile = fopen(argv[1],"r");
if(wavFile == NULL)
{
printf("Unable to open wave file\n");
exit(EXIT_FAILURE);
}
fread(&wavHeader,headerSize,1,wavFile);
filelength = getFileSize(wavFile);
fclose(wavFile);
printf("\nWav file header information:\n");
printf("Filesize\t\t\t%d bytes\n",filelength);
printf("RIFF header\t\t\t%c%c%c%c\n",wavHeader.RIFF[0],wavHeader.RIFF[1],wavHeader.RIFF[2],wavHeader.RIFF[3]);
printf("WAVE header\t\t\t%c%c%c%c\n",wavHeader.WAVE[0],wavHeader.WAVE[1],wavHeader.WAVE[2],wavHeader.WAVE[3]);
printf("Subchunk1ID\t\t\t%c%c%c%c\n",wavHeader.fmt[0],wavHeader.fmt[1],wavHeader.fmt[2],wavHeader.fmt[3]);
printf("Chunk Size (based on bits used)\t%d\n",wavHeader.ChunkSize);
printf("Subchunk1Size\t\t\t%d\n",wavHeader.Subchunk1Size);
printf("Sampling Rate\t\t\t%d\n",wavHeader.SamplesPerSec); //Sampling frequency of the wav file
printf("Bits Per Sample\t\t\t%d\n",wavHeader.bitsPerSample); //Number of bits used per sample
printf("AudioFormat\t\t\t%d\n",wavHeader.AudioFormat);
printf("Number of channels\t\t%d\n",wavHeader.bitsPerSample); //Number of channels (mono=1/sterio=2)
printf("Byte Rate\t\t\t%d\n",wavHeader.bytesPerSec); //Number of bytes per second
printf("Subchunk2ID\t\t\t%c%c%c%c\n",wavHeader.Subchunk2ID[0],wavHeader.Subchunk2ID[1],wavHeader.Subchunk2ID[2],wavHeader.Subchunk2ID[3]);
printf("Subchunk2Size\t\t\t%d\n",wavHeader.Subchunk2Size);
printf("\n");
return 0;
}
int getFileSize(FILE *inFile)
{
int fileSize = 0;
fseek(inFile,0,SEEK_END);
fileSize=ftell(inFile);
fseek(inFile,0,SEEK_SET);
return fileSize;
}`
最佳答案
所以,如果您使用文件格式规范作者使用的相同编译器和操作系统(32 位 Windows)来编译它,您的代码基本上可以工作。您希望编译器已完全按照您需要的结构布局来匹配文件字节。例如,我可以在 win32 上编译并运行它,并完美地读取 WAV 文件 - 一直到您无法编码的 header 的可变部分。
在编写了大量代码来操作各种文件格式后,我建议您放弃尝试读取结构,而是为“读取接下来的 4 个字节并将它们转换为”之类的事情创建一些简单的实用函数一个整数”。
注意诸如“额外格式字节”之类的内容。文件格式的某些部分取决于文件格式前面部分的值。这就是为什么您通常需要将其视为一个动态的阅读过程,而不是一次大的阅读来获取标题。保持结果高度可移植的 C 语言并不难,它可以在操作系统之间工作,而不依赖于操作系统特定的东西,如 stat() 或为 htonl() 之类的东西添加库依赖项——应该可移植性(甚至可以移植到不同的编译器或即使只是同一操作系统上的不同编译器选项)也是可取的。
关于读取 Wav 头文件的代码会产生奇怪的结果? C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948442/