Lecteur de fichier multimédia riff

5/5 (3 avis)

Vue 6 266 fois - Téléchargée 1 035 fois

Description

Le format RIFF (Resource Interchange File Format) est très utilisé dans le monde multimédia. Sa simplicité de conception en a fait un standard international pour le son, la vidéo, et bien d'autres choses. Il est basé sur le concept de sections imbriquées, qui contiennent chacune un identifiant, une taille et des données. Ainsi, tout fichier RIFF est sa propre section, en commençant par "RIFF", suivi par le type du fichier, suivi par la taille des données, codées sur 32 bits, suivi par les données elles-mêmes. Un schéma simple de la construction d'un fichier RIFF standard :

"RIFF" dans les quatre premiers octets du fichier (52494646 en hexadécimal)
[Type du fichier] dans les quatre octets suivants, par exemple "WAVE"
[Taille du fichier] codée sur 32 bits
[Les données] qui ont une taille égale à celle renseignée précédemment

Les données peuvent également contenir plusieurs sections imbriquées, par exemple le format WAVE standard (PCM) comporte deux sections "fmt " et "data". La première contient le format du son wave (taux d'échantillonnage, mono/stéréo, ...), et la seconde contient le son codé selon le format renseigné précédemment.

Assez de théorie, venons-en à la source. Cette source contient deux unités : RIFF.pas, et WAVE.pas. La première permet de lire un fichier RIFF, et d'en extraire les différentes sections, sous la forme d'emplacements en mémoire. La seconde unité montre comment lire un fichier WAVE en utilisant le format RIFF.

L'application exemple, propose de lire un fichier WAVE de votre choix (j'ai inclus un petit exemple). Mais attention : je n'utilise ni un lecteur externe, ni la fonction PlaySound : je passe directement les données au pilote multimédia du système. Formidable, non ?

Les deux unités, RIFF.pas et WAVE.pas, en sont évidemment à leur première mouture. On ne peut que lire, et il n'y a pas moyen de savoir où en est la lecture du son, ce qui serait possible en transmettant non pas tout le fichier d'un coup au pilote, mais transmettre une seconde de son à la fois.

Ah oui pour info, le format RIFF ne concerne evidemment pas que les fichiers wav. Un fichier PNG est aussi un fichier RIFF, au même titre que les fichiers MP3 ou encore MPEG, ... par contre ce type de fichiers a un peu délaissé les spécifications du format RIFF, en omettant d'inclure la section "RIFF" elle-même. Donc sur ces fichiers, mon unité échouera, mais ça se corrige facilement en désactivant la vérification (CheckRIFF) ! Mais bon ... passer un MP3 directement au pilote multimédia c'est déjà harcore, alors passer un MPEG :)

Source / Exemple :


// In the zip

Conclusion :


Voilà, tous commentaires, critiques, conseils, remarques, ...
Codé sous Delphi 6 Personal Edition.
J'ai essayé de mettre quelques commentaires mais il faut bien comprendre que les API utilisées sont assez compliquées à aborder.

Cordialement, Bacterius !

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Bacterius
Messages postés
3792
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
28 juin 2010 à 06:20
Salut,
@Francky : merci ! j'avais l'intention de faire ce code depuis quelques semaines déjà mais par manque de temps et de volonté j'ai pris du retard. Pour les mp3, je pense déjà faire une version évoluée de l'unité RIFF.pas, où l'on pourrait éditer, supprimer et ajouter des sections au fichier de façon transparente (mais c'est pas gagné : j'ai jamais essayé de redimensionner un fichier mappé en mémoire). Pour les mp3, il faudrait se renseigner sur le format, car c'est compressé avec une méthode particulière, donc à moins de décompresser en WAVE puis l'envoyer au pilote, je ne vois pas trop comment faire.

@Cari : merci ! J'ai mis ce petit exemple pour lui faire plaisir :D
"Il faudra cependant que j'y revienne car, pour moi, ce n'est pas très facile de prime abord..."
J'aurai bien voulu mettre davantage de commentaires, mais le problème c'est que ce n'est pas le code en lui-même qui est difficile (à part peut-être les API multimédia qui peuvent se comporter bizarrement), c'est surtout les concepts et les idées de formats sous-jacents. Même remarque, je pense étayer RIFF.pas pour en faire une unité de gestion complète des fichiers RIFF. Ainsi, une fois ceci terminé, il sera presque trivial de lire et éditer un PNG (en ouvrant le RIFF, extraire le header pour les dimensions de l'image, extraire les données, les décompresser sous forme de bitmap avec ZLib et afficher) !

Merci à vous deux pour les notes, c'est la première fois que je reçois deux 10/10 à la suite :p

Cordialement, Bacterius !
Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
18
27 juin 2010 à 23:20
Je ne sais pas pourquoi, mais Cashemire a été particulièrement intéressée par ton source, Bacterius. :)

Il faudra cependant que j'y revienne car, pour moi, ce n'est pas très facile de prime abord...
En attendant, je te mets quand même une note car c'est très prometteur et que tu as largement deblayé le terrain.
Merci et bravo !
Utilisateur anonyme
27 juin 2010 à 19:46
Salut,

Bien ce petit code et en plus il y a eu un travail de recherche.
C'est bizarre que tu n'ai pas collé des threads lol ;).
Bien pas grand chose à rajouter à part que c'est très instructif.

A quand les MP3 ? ;)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.