2013-05-08 3 views
0

Мне нужно нормализовать .wav аудиофайл. Преемник для получения метаданных (первые 44 байта) из файла (ChunkID, ChunkSize, Format, fmt и так далее.), Поэтому я могу узнать, сколько каналов есть (NumChannels) или BitPerSaple т.д.Как найти размер данных (образцов) .wav-файла?

Теперь у меня есть скопировать данные всех выборок в динамически выделенный массив , но я не знаю, как получить размер файла (для использования в функции 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; Код :: Блоки IDE.


UPDATE (РЕШЕНИЕ!): Как оказалось, я уже имел значение размер образцов (Subchunk2Size). Поэтому в моем случае я просто должен использовать hdr.S2.Subchunk2Size для функции malloc().

ответ

1

stat -Меньше реализации, чтобы найти файл-размер,

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; 
} 
1

"как получить размер файла": использовать 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; 

    /* ... */ 
} 
+0

Хотели бы вы объяснить это? ** Я хотел бы знать, как это работает. ** – yulian

+0

'fstat' - это переносная функция, которая извлекает метаданные файлов. Среди этих метаданных - размер файла. –

+0

Уверен: если вы находитесь в Unix, juste type 'man stat'; если нет, прочитайте его на http://linux.die.net/man/2/fstat. В других системах (я не знаю, что у вас), обратитесь к документации .. –