2013-06-28 3 views
0

J'ai essayé de lire le fichier d'en-tête du fichier RIFF. Tout a l'air bien. Mais quand j'ai respecté et couru, tous les fichiers que j'ai lus avaient la même taille de données. Je ne sais pas pourquoi? J'avais couru du code sur la lecture du header_file du fichier RIFF mais ce n'était pas différent.Lecture de l'en-tête du fichier WAVE

#include <iostream> 
#include <fstream> 
#include <cstdio> 
#include <cstring> 
#include <vector> 
#include <stdint.h> 
#include <cmath> 

using namespace std; 

#define SWAPPED_US(x) (((x) >> 8) | ((x) << 8)) 
#define SWAPPED_UL(x) ((((x) >> 24) & 0xff) | (((x) << 8) & 0xff0000) | (((x) >> 8) & 0xff00) | (((x) << 24) & 0xff000000)) 

#pragma pack(push, 1) 
typedef struct { 
    char ID [4]; 
    uint32_t Size; 
    char Format [4]; 
    char SubID_1 [4]; 
    uint32_t SubSize_1; 
    uint16_t AudioFmt; 
    uint16_t Channel; 
    uint32_t Frequency; 
    uint32_t bytesRate; 
    uint16_t BlockAlign; 
    uint16_t BitsPerSample; 
    char SubID_2 [4]; 
    uint32_t SubSize_2; 
} RIFF_header; 
#pragma pack(pop) 

int getFileSize(FILE *inFile){ 
    int fileSize = 0; 
    fseek(inFile,0,SEEK_END); 
    fileSize=ftell(inFile); 
    fseek(inFile,0,SEEK_SET); 
    return fileSize; 
} 

int main() 
{ 
    FILE *fpoint; 
    fpoint = fopen ("test.wav", "rb"); 
    RIFF_header *wave_file; wave_file = new RIFF_header; 
    fread ((void*)wave_file, sizeof (RIFF_header), (size_t)1, fpoint); 


    wave_file->SubSize_2 = SWAPPED_UL(wave_file->SubSize_2); // I think it's big-endianess so we have to swap byte 

    cout << "Size of file:  " << getFileSize(fpoint) << endl; 
    cout << "Header:   " << wave_file->ID[0] 
         << wave_file->ID[1] 
         << wave_file->ID[2] 
         << wave_file->ID[3] << endl; 

    cout << "Format:   " << wave_file->Format[0] 
         << wave_file->Format[1] 
         << wave_file->Format[2] 
         << wave_file->Format[3] << endl; 

    cout << "Sub-chunk1 ID:   " << wave_file->SubID_1[0] 
          << wave_file->SubID_1[1] 
         << wave_file->SubID_1[2] 
         << wave_file->SubID_1[3] << endl; 

    cout << "Sub-chunk1 Size: " << wave_file->SubSize_1 << endl; 

    cout << "Audio Format:  " << wave_file->AudioFmt << endl; 

    cout << "Channel:  " << wave_file->Channel << endl; 

    cout << "Sample Rate:  " << wave_file->Frequency << endl; 

    cout << "Byte Rate:   " << wave_file->bytesRate << endl; 

    cout << "BlockAlign:  " << wave_file->BlockAlign << endl; 

    cout << "Bits per sample: " << wave_file->BitsPerSample << endl; 

    cout << "Sub-chunk2 ID:   " << wave_file->SubID_2[0] 
         << wave_file->SubID_2[1] 
         << wave_file->SubID_2[2] 
         << wave_file->SubID_2[3] << endl; 
    cout << "Sub-chunk2 Size: " << wave_file->SubSize_2 << endl; 
    return 0; 
} 
+0

Les tailles de subchunk sont stockés dans l'en-tête comme little- endian, pas big-endian. – Michael

+0

Et quelle est cette taille magique que vous obtenez toujours? Peut-être que l'alignement de votre structure d'en-tête est désactivé par quelques octets et que vous lisez quelque chose d'autre alors vous pensez (tout est biaisé)? –

+0

ce nombre est 2147418112 et après avoir échangé des octets, c'est 65407. – user2530847

Répondre

0

vérifier votre SubSize_1 ... il est parfois 16 octets, parfois 18. Si vous avez ce mal, votre SubSize_2 sera mal aussi ...

+0

Pouvez-vous me dire pourquoi? – user2530847

+0

dépend juste de l'application qui a écrit l'en-tête WAV ... un était un format plus ancien, mais il est toujours généralement acceptable – mark

+0

mais j'avais téléchargé du code source et il est toujours resté le même :( – user2530847