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/
Pourquoi le module 'wave' n'est-il pas bon pour cela? –
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