如何查找 .wav 文件的数据(样本)大小?
Posted
技术标签:
【中文标题】如何查找 .wav 文件的数据(样本)大小?【英文标题】:How to find the size of data (samples) of the .wav file? 【发布时间】:2013-05-08 19:15:06 【问题描述】:我必须标准化.wav
音频文件。成功从文件中获取元数据(前 44 个字节)(ChunkID
、ChunkSize
、Format
、fmt
等等。)所以我可以找出有多少频道(NumChannels
)或BitPerSaple
等
现在我必须将所有样本的数据复制到动态分配的数组中但我不知道如何获取文件的大小(用于malloc()
函数)。
这是代码(如果有帮助的话):
#include <stdio.h>
#include <stdlib.h>
#define hdr_SIZE 44
typedef struct FMT
char SubChunk1ID[4];
int SubChunk1Size;
short int AudioFormat;
short int NumChannels;
int SampleRate;
int ByteRate;
short int BlockAlign;
short int BitsPerSample;
fmt;
typedef struct DATA
char Subchunk2ID[4];
int Subchunk2Size;
int Data[441000];
data;
typedef struct HEADER
char ChunkID[4];
int ChunkSize;
char Format[4];
fmt S1;
data S2;
header;
int main()
char nameIn[255], nameOut[255];
printf("Enter the names of input and output files including file extension:\n");
scanf ("%s", nameIn);
//printf("%s\n", nameIn);
scanf ("%s", nameOut);
//printf("%s\n", nameOut);
FILE *input = fopen( nameIn, "rb");
FILE *output = fopen( nameOut, "wb");
header hdr;
if(input == NULL)
printf("Unable to open wave file (input)\n");
exit(EXIT_FAILURE);
fread(&hdr, sizeof(char), hdr_SIZE, input);
/* Displaying file's metadata (chunks). */
printf("\n*********************************\n");
printf("WAVE file's metadata:\n\n");
printf("%4.4s\n", hdr.ChunkID );
printf("%d\n", hdr.ChunkSize );
printf("%4.4s\n", hdr.Format );
printf("%4.4s\n", hdr.S1.SubChunk1ID );
printf("%d\n", hdr.S1.SubChunk1Size );
printf("%d\n", hdr.S1.AudioFormat );
printf("%d\n", hdr.S1.NumChannels );
printf("%d\n", hdr.S1.SampleRate );
printf("%d\n", hdr.S1.ByteRate );
printf("%d\n", hdr.S1.BlockAlign );
printf("%d\n", hdr.S1.BitsPerSample );
printf("%4.4s\n", hdr.S2.Subchunk2ID );
printf("%d\n", hdr.S2.Subchunk2Size );
printf("\n*********************************\n");
/* Dead end... =( */
fclose(input);
fclose(output);
return 0;
操作系统 Windows 7; Code::Blocks IDE。
更新(解决方案!):
事实证明,我已经有了样本的大小值 (Subchunk2Size
)。所以在我的情况下,我只需要使用hdr.S2.Subchunk2Size
来实现malloc()
函数。
【问题讨论】:
【参考方案1】:stat
-less 实现查找文件大小是,
long get_file_size( char *filename )
FILE *fp;
long n;
/* Open file */
fp = fopen(filename, "rb");
/* Ignoring error checks */
/* Find end of file */
fseek(fp, 0L, SEEK_END);
/* Get current position */
n = ftell(fp);
/* Close file */
fclose(fp);
/* Return the file size*/
return n;
【讨论】:
【参考方案2】:“如何获取文件大小”:使用stat(2)
:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
long get_file_size(int fd)
struct stat st;
if (fstat(fd, &st) == -1)
return -1; /* error.. */
return (long) st.st_size;
int main()
/* ... */
long data_size;
data_size = get_file_size(fileno(input)) - hdr_SIZE;
/* ... */
【讨论】:
您想解释一下吗? 我想知道它是如何工作的。fstat
是一个可移植的函数,用于检索文件元数据。其中元数据是文件的大小。
当然:如果您使用的是 Unix,只需键入 man stat
;如果没有,请在linux.die.net/man/2/fstat 上阅读。在其他系统上(我不知道你的是什么),请查阅文档..
@xtofpernaud 更新:操作系统 Windows 7。以上是关于如何查找 .wav 文件的数据(样本)大小?的主要内容,如果未能解决你的问题,请参考以下文章