如何查找 .wav 文件的数据(样本)大小?

Posted

技术标签:

【中文标题】如何查找 .wav 文件的数据(样本)大小?【英文标题】:How to find the size of data (samples) of the .wav file? 【发布时间】:2013-05-08 19:15:06 【问题描述】:

我必须标准化.wav 音频文件。成功从文件中获取元数据(前 44 个字节)(ChunkIDChunkSizeFormatfmt 等等。)所以我可以找出有多少频道(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 文件的数据(样本)大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 32 位浮点数据编写 wav 文件?

如何在java中将Wav文件拆分为通道?

混合不同大小的声音文件

我如何采样音频文件说 .wav ,专门将其导入数组并将其分成块。 (在 Lua 中)

.mp3 大小与 .wav 大小相比如何?

“WAV 参数集”是正确的名称吗?