visual studio soundplayer sound sonido reproducir poner play net musica fondo computer como asp c# audio wav

studio - soundplayer c#



¿Cómo unir 2 o más archivos.WAV juntos mediante programación? (5)

Aquí hay una función básica de concatenación WAV construida con NAudio . Esto asegurará que solo los fragmentos de datos estén concatenados (a diferencia del ejemplo de código en este artículo de CodeProject vinculado en otra respuesta). También lo protegerá contra la concatenación de archivos WAV que no comparten el mismo formato.

public static void Concatenate(string outputFile, IEnumerable<string> sourceFiles) { byte[] buffer = new byte[1024]; WaveFileWriter waveFileWriter = null; try { foreach (string sourceFile in sourceFiles) { using (WaveFileReader reader = new WaveFileReader(sourceFile)) { if (waveFileWriter == null) { // first time in create new Writer waveFileWriter = new WaveFileWriter(outputFile, reader.WaveFormat); } else { if (!reader.WaveFormat.Equals(waveFileWriter.WaveFormat)) { throw new InvalidOperationException("Can''t concatenate WAV Files that don''t share the same format"); } } int read; while ((read = reader.Read(buffer, 0, buffer.Length)) > 0) { waveFileWriter.WriteData(buffer, 0, read); } } } } finally { if (waveFileWriter != null) { waveFileWriter.Dispose(); } } }

Necesito la capacidad de unir 2 o más archivos .wav juntos en un archivo .wav. Debo hacer esto programáticamente, usando C # (los productos de terceros no son una opción). Sé de la clase System.Media.SoundPlayer, pero no busco jugar el .wav, sino solo crearlo.


Echa un vistazo a este ejemplo de proyecto de código, parece ser exactamente lo que necesitas con una buena explicación de cómo hacerlo también:

Concatenando archivos de onda usando C # 2005

Parece que consiste esencialmente en extraer y fusionar los datos de sonido de todos los archivos wav en una sola porción de datos con un nuevo encabezado de archivo en la parte superior

EDIT: No tengo experiencia en el uso de esto, ni soy un experto. Acabo de encontrar este artículo y pensé que podría ser útil. Vea la respuesta de Mark Heath para una mejor solución.


Si necesita obtener solo una matriz de bytes, para insertar en la base de datos o alguien más. Puedes usar el flujo de memoria:

public static byte[] Concatenate(IEnumerable<byte[]> sourceData) { var buffer = new byte[1024 * 4]; WaveFileWriter waveFileWriter = null; using (var output = new MemoryStream()) { try { foreach (var binaryData in sourceData) { using (var audioStream = new MemoryStream(binaryData)) { using (WaveFileReader reader = new WaveFileReader(audioStream)) { if (waveFileWriter == null) waveFileWriter = new WaveFileWriter(output, reader.WaveFormat); else AssertWaveFormat(reader, waveFileWriter); WaveStreamWrite(reader, waveFileWriter, buffer); } } } waveFileWriter.Flush(); return output.ToArray(); } finally { waveFileWriter?.Dispose(); } } } private static void AssertWaveFormat(WaveFileReader reader, WaveFileWriter writer) { if (!reader.WaveFormat.Equals(writer.WaveFormat)) { throw new InvalidOperationException("Can''t concatenate WAV Files that don''t share the same format"); } } private static void WaveStreamWrite(WaveFileReader reader, WaveFileWriter writer, byte[] buffer) { int read; while ((read = reader.Read(buffer, 0, buffer.Length)) > 0) { writer.Write(buffer, 0, read); } }


Un comentario sobre la respuesta de Mark:

El operador == no parece funcionar para mí al comparar formatos de onda. Es más seguro hacer esto:

if (!reader.WaveFormat.Equals(waveFileWriter.WaveFormat))

Alternativamente, puede envolver el lector en un WaveFormatConversionStream y deshacerse completamente de la verificación de formato (no estoy seguro de si funcionará en todos los escenarios, pero pude probarlo con éxito).


Usar desde Cómo unir archivos .Wav juntos

private void JoinWav() { string[] files = new string[] { "1990764-ENG-CONSEC-RESPONSE7.WAV","1990764-ND_A.WAV", "1990764-SIGHT-SP.WAV", "1990764-SP-CONSEC-RESPONSE6.WAV","1990764-VOCABWORD-004-12-SP.WAV","bi-consec-1-successful.wav", "bi-transition-instruct.wav","nd_B.wav","sightreceived_B.wav","teststamp_A.wav" }; AudioCompressionManager.Join("res.wav", files); }