读取 Wav 头文件的代码会产生奇怪的结果? C

标签 c wav

我需要从波形文件中读取 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/

相关文章:

c# - 如何更改 .wav 格式音频文件比特率

c - 从 C 中的 For 循环返回值

c - 一个非常简单的程序中的指令顺序错误

c - 使用宏的泛型编程 : tricks to determine type?

c - 同名的两个函数 : One static How to declare in header file

asp.net - 在 Internet Explorer 中使用 asp.net 下载 .wav 文件

c - 为什么可以使用堆栈内的指针更改 const 值?

python - 使用来自 SciPy 的 wavfile.write 在 Python 中编写 wav 文件

javascript - Web Audio API - Javascript 创建的 WAV 文件长度不正确并且无声

audio - 如何将音频嵌入到 Jekyll 博客中?