2010-11-17 6 views
2

J'écris un programme pour analyser un en-tête de fichier WAV et imprimer les informations à l'écran. Avant d'écrire le programme que je suis en train de faire des recherchesEnseer l'en-tête de fichier WAV

hexdump -n 48 sound_file_8000hz.wav

00000000 52 49 46 46 bc af 01 00 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt | 
00000010 10 00 00 00 01 00 01 00 >40 1f 00 00< 40 1f 00 00 |[email protected]@...| 
00000020 01 00 08 00 64 61 74 61 98 af 01 00 81 80 81 80 |....data........| 

hexdump -n 48 sound_file_44100hz.wav

00000000 52 49 46 46 c4 ea 1a 00 57 41 56 45 66 6d 74 20 |RIFF....WAVEfmt | 
00000010 10 00 00 00 01 00 02 00 >44 ac 00 00< 10 b1 02 00 |........D.......| 
00000020 04 00 10 00 64 61 74 61 a0 ea 1a 00 00 00 00 00 |....data........| 

La partie entre> et < dans les deux fichiers sont le taux d'échantillonnage.

Comment "40 1f 00 00" se traduit par 8000Hz et "44 ac 00 00" par 44100Hz? Des informations telles que le nombre de canaux et le format audio peuvent être lues directement à partir du vidage. J'ai trouvé un script Python appelé WavHeader qui analyse correctement la fréquence d'échantillonnage dans les deux fichiers. Tel est le cœur du script:

bufHeader = fileIn.read(38) 
    # Verify that the correct identifiers are present 
    if (bufHeader[0:4] != "RIFF") or \ 
     (bufHeader[12:16] != "fmt "): 
     logging.debug("Input file not a standard WAV file") 
     return 
    # endif 
    stHeaderFields = {'ChunkSize' : 0, 'Format' : '', 
     'Subchunk1Size' : 0, 'AudioFormat' : 0, 
     'NumChannels' : 0, 'SampleRate' : 0, 
     'ByteRate' : 0, 'BlockAlign' : 0, 
     'BitsPerSample' : 0, 'Filename': ''} 
    # Parse fields 
    stHeaderFields['ChunkSize'] = struct.unpack('<L', bufHeader[4:8])[0] 
    stHeaderFields['Format'] = bufHeader[8:12] 
    stHeaderFields['Subchunk1Size'] = struct.unpack('<L', bufHeader[16:20])[0] 
    stHeaderFields['AudioFormat'] = struct.unpack('<H', bufHeader[20:22])[0] 
    stHeaderFields['NumChannels'] = struct.unpack('<H', bufHeader[22:24])[0] 
    stHeaderFields['SampleRate'] = struct.unpack('<L', bufHeader[24:28])[0] 
    stHeaderFields['ByteRate'] = struct.unpack('<L', bufHeader[28:32])[0] 
    stHeaderFields['BlockAlign'] = struct.unpack('<H', bufHeader[32:34])[0] 
    stHeaderFields['BitsPerSample'] = struct.unpack('<H', bufHeader[34:36])[0] 

Je ne comprends pas comment cela peut extraire les taux d'échantillonnage CORRET, quand je peux ne pas utiliser hexdump?

J'utilise des informations sur le format de fichier WAV à partir de cette page:

https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

+0

Pourquoi le module 'wave' n'est-il pas bon pour cela? –

+0

Je n'écris pas mon application en Python, j'essaie simplement de savoir pourquoi je ne peux pas analyser la fréquence d'échantillonnage correctement. – anderson25

Répondre

8

Les « 40 1F 00 00 » octets assimilent à un nombre entier dont la valeur hexadécimale est 00001F40 (rappelez-vous que les entiers sont stockés dans un fichier WAVE dans le petit format endian). De même, les octets "44 AC 00 00" équivalent à un entier dont la valeur hexadécimale est 0000AC44. Une valeur de 0000AC44 en hexadécimal équivaut à une valeur décimale de 44100.

+0

Merci pour l'explication. – anderson25