Question

J'écris une application en C # qui enregistre des fichiers audio (* .wav) et automatiquement les balises et les nommer. Les fichiers Wave sont des fichiers RIFF (comme AVI) qui peuvent contenir des morceaux de méta-données, en plus des blocs de données de forme d'onde. Alors maintenant, je suis en train de comprendre comment lire et écrire les données méta RIFF et de fichiers d'onde enregistrés.

J'utilise NAudio pour enregistrer les fichiers, et demandé sur leurs forums comme bien sur le SO façon de lire et balises RIFF d'écriture. Bien que je reçu un certain nombre de bonnes réponses, aucune des solutions a permis la lecture et l'écriture morceaux RIFF aussi facilement que je le voudrais.

Mais plus important encore, j'ai très peu d'expérience avec les fichiers à Dealing un niveau octet, et je pense que cela pourrait être une bonne occasion d'apprendre. Alors maintenant, je veux essayer d'écrire ma propre classe (s) qui peut lire dans un fichier RIFF et permettre des méta-données à lire, et écrit à partir du fichier.

J'ai flux utilisé en C #, mais toujours avec tout le flux à la fois. Alors maintenant, je suis peu perdu que je dois considérer un octet de fichier par octet. Plus précisément comment pourrais-je aller sur la suppression ou l'insertion d'octets et à partir du milieu d'un fichier? J'ai essayé de lire un fichier par un FileStream dans un tableau d'octets (byte []), comme indiqué dans le code ci-dessous.

System.IO.FileStream waveFileStream = System.IO.File.OpenRead(@"C:\sound.wav");
byte[] waveBytes = new byte[waveFileStream.Length];
waveFileStream.Read(waveBytes, 0, waveBytes.Length);

Et je pouvais voir à travers le débogueur Visual Studio que les quatre premiers octets sont l'en-tête RIFF du fichier. text alt

Mais les tableaux sont une douleur à traiter lors de l'exécution des actions qui changent leur taille comme l'insertion ou la suppression des valeurs. Donc, je pensais que je pouvais alors l'octet [] dans une telle liste.

List<byte> list = waveBytes.ToList<byte>();

Ce qui rendrait toute manipulation de l'octet par octet de fichier beaucoup plus facile, mais je suis inquiet que je pourrais manquer quelque chose comme une classe dans le System.IO espace de nom qui rendrait tout cela encore plus facile. Suis-je sur la bonne voie, ou est-il une meilleure façon de le faire? Je dois aussi mentionner que je ne suis pas extrêmement préoccupé par la performance, et préférerais ne pas traiter avec des pointeurs ou des blocs de code dangereux comme ce type .

Si elle aide du tout ici est un bon article sur le RIFF / format de fichier WAV.

Était-ce utile?

La solution

Je n'ai pas écrit en C #, mais peut pointer sur certains endroits qui sont mauvais de mon point de vue:

1) Ne pas lire les fichiers entiers WAV en mémoire à moins que les fichiers sont vos propres fichiers et ont en connaissance de cause de petite taille.

2) Il n'y a pas besoin d'insérer des données dans la mémoire. Vous pouvez par exemple simplement faire ce qui suit: Analyser le fichier source, les décalages de stocker des morceaux, et les métadonnées de lecture en mémoire; présenter les métadonnées pour le montage dans une boîte de dialogue; tout en économisant écriture en-tête RIFF-WAV, morceau fmt, transfert des données audio à partir du fichier source (par la lecture et l'écriture de blocs), ajouter des métadonnées; mise à jour en-tête RIFF-WAV.

3) Essayez Enregistrer les métadonnées dans la queue du fichier. Cela entraîne une alternance que marqueur ne nécessitera pas ré-écriture de fichier entier.

Il semble que certaines sources en ce qui concerne l'utilisation des fichiers RIFF en C # sont présents ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top