Pregunta

Estoy escribiendo una aplicación en C # que grabar archivos de audio (* .wav) y automáticamente la etiqueta y el nombre de ellos. archivos de onda son archivos RIFF (como AVI) que pueden contener trozos de metadatos además de los fragmentos de datos de forma de onda. Así que ahora estoy tratando de encontrar la manera de leer y escribir los datos RIFF meta hacia y desde los archivos de sonido grabados.

Estoy usando NAudio para el registro de los archivos, y se le preguntó sobre sus foros como bien en SO de manera de leer y escribir etiquetas RIFF. Si bien he recibido un buen número de respuestas, ninguna de las soluciones para la lectura permitió y escritura trozos RIFF tan fácilmente como me gustaría.

Pero lo más importante que tengo muy poca experiencia en el trato con los archivos a nivel de byte, y que esto podría ser una buena oportunidad para aprender. Así que ahora quiero intentar escribir mi propia clase (s) que pueden leer en un archivo RIFF y permitir que los metadatos para ser leído y escrito del archivo.

He usado corrientes en C #, pero siempre con toda la corriente a la vez. Así que ahora estoy poco perdido que tengo que considerar un byte a byte de archivos. Específicamente cómo hago para quitar o insertar bytes desde y hacia el centro de un archivo? He intentado leer un archivo a través de un FileStream en una matriz de bytes (byte []) como se muestra en el siguiente código.

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

Y yo podía ver a través del depurador de Visual Studio que la primera de cuatro bytes son la cabecera RIFF del archivo. text alt

Pero las matrices son un dolor para hacer frente a la hora de realizar acciones que cambian su tamaño como de introducir o extraer valores. Así que estaba pensando que pude entonces al byte [] en una lista como esta.

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

¿Qué haría que cualquier manipulación del byte a byte de archivos mucho más fácil, pero estoy preocupado puede ser que falte algo así como una clase en el espacio de nombres System.IO que haría que todo esto sea aún más fácil. ¿Estoy en el camino correcto, o hay una mejor manera de hacer esto? También debería mencionar que no estoy preocupado enormemente con el rendimiento, y preferiría no tratar con punteros o bloques de código no seguros como este tipo .

Si se ayuda a todos aquí es un buen artículo en el RIFF formato / archivo WAV.

¿Fue útil?

Solución

no he escrito en C #, pero puedo señalar en algunos lugares que son malas desde mi punto de vista:

1) No lea los archivos WAV enteros en la memoria a menos que los archivos son sus propios archivos y conscientemente tener pequeño tamaño.

2) No hay necesidad de insertar un conjunto de datos en la memoria. Simplemente puede hacer al respecto, por ejemplo, lo siguiente: Analizar el archivo de origen, almacenar compensaciones de trozos y leer los metadatos en la memoria; presentar los metadatos para la edición en un cuadro de diálogo; mientras que el ahorro de escritura cabecera RIFF-WAV, trozo FMT, de transferencia de datos de audio del archivo de origen (mediante la lectura y escritura de bloques), añadir metadatos; actualización de la cabecera RIFF-WAV.

3) Trate de guardar los metadatos en la cola del archivo. Esto le da lugar a la alternancia única etiqueta no será necesario re-escritura del archivo completo.

Parece que algunas fuentes en relación con el trabajo con archivos RIFF en C # están presentes aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top