Déterminer la durée en secondes d'un Wave et ENTETE d'un fichier Wave

Je met ce truc car les 2 autres trucs répondant au męme sujet que j'ai trouvé sur ce site
sont faux.
Les 2 autres solution proposées s'appuie sur une entęte de fichier WAV (header) fixe, ce qui
n'est pas le cas ! Par exemple si vous enregistrez un WAV avec le "magnétophone"
(dans accessoires/divertissements de Windows 98) l'entęte n'est pas celle attendue par les
deux solutions "concurrentes"

L'entete d'un fichier wave commence toujours par 'RIFF', est suivie par la taille (longint)
du reste du fichier (soit taille du fichier moins 8, on se demande à quoi ça sert !
Puis les caractères 'WAVE' puis 'fmt ' (ne pas oublier l'espace), puis la taille (longint)
de la section 'fmt '. Apparemment cette taille à échapé à mes deux confrères, puisqu'ils l'ont
tous deux considéré comme fixée à 16 (alors que, par exemple avec sndrec32.exe, cette taille
est 18, pour une utilité tout à fait inconnue pour moi)
Les données qui suivent la taille de la section 'fmt ', décrivent le format wave,
c'est à dire :
-Code de format, par exemple pour "micro pulse code modulation" on à la valeur 1. (Word)
-Nombre de canaux (Mono=1 ou Stéréo=2) (Word)
-Fréquence d'échantillonage en Hertz (LongInt) par exemple 44 000
-Nbr d'octets par secondes (LongInt) : produit de la frequence par le nbr de canaux
(en 8 bits) le double si on est en 16 bits
-Nbr d'octets par échantillon : Mono 8 bits = 1 jusqu'à Stéréo 16 bits=4 (Word)
-Nbr de bits, 8 ou 16. (Word)
Puis si la taille de la section 'fmt ' est supérieure à 16 d'autres données de format suivent.
Męme si nous ne les utilisont pas, tenons en compte pour nous caler sur la suites des
informations.
La section 'fmt ' peut aussi ętre suivie d'autres "sections". La section qui nous interresse
est la section 'DATA' précédée des caractères 'DATA' et de la taille de data (longint)

Résumé :

à 0 : RIFF
à 4 : [Taille fichier - 8] (Longint)
à 8 : WAVE
à 12 : fmt (ne pas oublier l'espace)
à 16 : [Taille section fmt] (LongInt $0010 ou $0012)
à 20 : [Code de Format] (Word, en général $01)
à 22 : [Nbr de canaux] (Word, $01 ou $02)
à 24 : [Fréquence Ech.] (LongInt)
à 28 : [Nbr Oct/sec] (LongInt)
à 32 : [Nbr Oct/Echantillon](Word, $01, $02 ou $04)
à 34 : [Echantillonage] (Word, $08 ou $10)
...
à ? : DATA
à ?+4 : [Taille des données]
à ?+8 : début des données

Donc pour connaitre la durée d'un son wave, nous avons besoin de connaitre la taille des
données et le nombre d'octet par seconde.

Pour avoir ces infos :


// Renvoie la durée en secondes du WAV spéc if ié par NF

Function DureeWAV( NF : ShortString ) : Real ;
Var F : File Of Char ;
T100 : Array [0..99] of Char ;
i : Integer ;
OctetsParS, TailleDesDonnees : LongInt ;
Begin
// INIT result
RESULT := 0 ;
// Assignation/Ouverture du Fichier (à améliorer en faisant
// une ouverture en lecture seule ...)
AssignFile(F,NF) ;
Reset(F) ;
// Lecture des 100 premiers caractères (dont l'entęte qui var ie de 44 à 58 octets,
// et plus ???)
For I := 0 to 99 Do Read(F,T100[I]) ;
// Copie de "OctetsParS"
Move(T100[28],OctetsParS,4) ;
// Recherche de [TailleData] (TailleDesDonnees)
For I := 0 to 95 Do // éventuellement : For I := 36 to 50 !!!
If (T100[I]='D') and
(T100[I+1]='A') and
(T100[I+2]='T') and
(T100[I+3]='A') then
Begin
Move(T100[i+4],TailleDesDonnees,4) ;
Result := tailleDesDonnees / OctetsParS ;
End ;
Close(F) ;
End ;
// REMARQUE : il n'est pas impossible que la section 'fmt ' ne soit pas à l'offset prévu.
// Dans ce cas, procédez à une recherche de 'fmt ' comme j'ai fait pour 'DATA'.
Ajouter un commentaire
Pseudo
Adresse email
Site internet (optionnel)
Votre commentaire
Fiche de l'article
Mise a jour02/06/2003
VisualisationVu 970 fois
PublicInternaute zz
CategorieDelphi - Trucs et astuces - Systeme
Auteur de l'article
arachnosoft arachnosoft
connecté le 02/11/2011
1 articles dans la section
Contacter l'auteur