2010-04-11 21 views
2

J'écris une application en C# qui va enregistrer les fichiers audio (* .wav) et les marquer et les nommer automatiquement. Les fichiers Wave sont des fichiers RIFF (comme AVI) qui peuvent contenir des blocs de métadonnées en plus des blocs de données de forme d'onde. Alors maintenant, j'essaie de comprendre comment lire et écrire les méta-données RIFF vers et depuis les fichiers wave enregistrés. J'utilise NAudio pour enregistrer les fichiers et j'ai demandé their forums comme well on SO pour lire et écrire des tags RIFF. Bien que j'ai reçu un certain nombre de bonnes réponses, aucune des solutions ne permettait de lire et en écrivant des blocs RIFF aussi facilement que je le voudrais.Besoin d'aide pour manipuler les fichiers WAV (RIFF) au niveau de l'octet

Mais surtout, j'ai très peu d'expérience dans le traitement des fichiers au niveau des octets, et je pense que cela pourrait être une bonne occasion d'apprendre. Alors maintenant je veux essayer d'écrire mes propres classes qui peuvent lire dans un fichier RIFF et permettre aux métadonnées d'être lues et écrites à partir du fichier.

J'ai utilisé des flux en C#, mais toujours avec le flux entier en même temps. Alors maintenant je suis un peu perdu que je dois considérer un octet de fichier par octet. Plus précisément, comment procéder pour supprimer ou insérer des octets vers et depuis le milieu d'un fichier? J'ai essayé de lire un fichier à travers 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 j'ai pu voir à travers le débogueur Visual Studio que les quatre premiers octets sont l'en-tête RIFF du fichier. Mais les tableaux sont difficiles à gérer lorsqu'ils exécutent des actions qui changent de taille, comme l'insertion ou la suppression de valeurs. Donc je pensais que je pourrais alors à l'octet [] dans une liste comme celle-ci.

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 même Plus facile. Suis-je sur la bonne voie, ou y a-t-il une meilleure façon de le faire? Je devrais également mentionner que je ne suis pas énormément préoccupé par la performance, et préférerais ne pas faire face à des pointeurs ou des blocs de code dangereux comme this guy.

Si cela vous aide, voici a good article au format de fichier RIFF/WAV.

Répondre

1

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 entiers fichiers WAV en mémoire à moins que les fichiers sont vos propres fichiers et ont en connaissance de cause petite taille.

2) Il n'est pas nécessaire d'insérer une donnée dans la mémoire. Vous pouvez simplement par exemple faire ce qui suit: Analyser le fichier source, stocker les offsets de morceaux, et lire les métadonnées en mémoire; présenter les métadonnées pour l'édition dans un dialogue; lors de l'enregistrement de l'en-tête RIFF-WAV, du fragment fmt, du transfert des données audio du fichier source (en lisant et en écrivant des blocs), ajoutez des métadonnées; mettre à jour l'en-tête RIFF-WAV.

3) Essayez d'enregistrer les métadonnées dans la queue du fichier. Cela se traduira par l'alternance que seule la balise ne nécessitera pas de réécriture du fichier entier.

Il semble que certaines sources concernant le travail avec les fichiers RIFF en C# soient présentes here.

+0

Bons points merci. Les fichiers wave que je suis en train d'étiqueter sont assez gros car ce sont des enregistrements de qualité CD de sorte qu'ils sont environ 50-100 mb chacun.Jusqu'à présent, les fichiers d'exemple que j'ai trouvés ont ajouté les méta-données (INFO: LIST) à la fin du fichier, mais je voudrais vraiment écrire ma classe pour rendre compte des morceaux dans n'importe quel ordre. –

+0

Parce que vous devriez être capable de lire n'importe quel matadata, mais écrire des métadonnées à la fin du fichier serait préférable. Comme vous l'avez noté, la plupart des fichiers balisés que vous avez trouvés ont des balises à la fin du fichier. De plus, je pense que la majorité des fichiers WAV que vous trouverez ne contiendront pas de métadonnées (dans les fichiers MP3). Ainsi, le marquage de fichiers WAV sans les réécrire sera possible dans la majorité des cas. – VitalyVal