2009-10-02 36 views
6

Tengo un archivo WAV muy grande, de aproximadamente 100 MB de tamaño. Me gustaría utilizar Java para leer este archivo wav y dividirlo en fragmentos más pequeños por cada 2 segundos de audio.¿Cómo dividir un archivo wav en fragmentos más pequeños usando Java?

¿Es posible hacer esto en Java? ¿Podría sugerirme una API con la que pueda lograrlo?

Gracias de antemano, Snehal

+0

Hola. Estoy leyendo un archivo .wav y también quiero dividirlo en trozos más pequeños y pasarlo a fin de averiguar la frecuencia en cada fragmento. Soy bastante nuevo en Java Sound, así que puedes ayudarme con esto. Adjunto la parte de mi código en el próximo comentario. Gracias de antemano – Learner

+0

float final [] floatBuffer = DTMF.generateDTMFTone (character); Cadena de lectura = "D: /RecordAudio31.wav"; InputStream in = new FileInputStream (lectura); // creando un audiostream desde inputstream AudioStream audioStream = new AudioStream (in); formato final AudioFormat = nuevo AudioFormat (44100, 16, 1, verdadero, falso); final AudioInputStream inputStream = new AudioInputStream (audioStream, formato, floatBuffer.length); final AudioDispatcher dispatcher = new AudioDispatcher (inputStream, stepSize, 0); dispatcher.addAudioProcessor (goertzelAudioProcessor); nuevo Thread (dispatcher) .start(); – Learner

+0

Lo descubrí. Gracias de todos modos. – Learner

Respuesta

4

Puede utilizar AudioInputStream y su AudioFileFormat miembro (que contiene una instancia AudioFormat) para saber qué escribir (formato, frecuencia de muestreo), puede utilizar AudioSystem escribirlo.

Según la frecuencia de muestreo del formato, puede averiguar cuántos bytes de audio son 2 segundos y seguir un ciclo de lectura de muchos bytes de AudioInputStream, escribiéndolos en un nuevo archivo.

+0

A través de AudioFileFormat Pude averiguar que la velocidad de muestreo es 8000. ¿Cuál es la relación entre la frecuencia de muestreo y la cantidad de bytes que ocupa? Soy un novato total en el manejo de audio, lo siento por mi ignorancia – Snehal

+2

Además de la frecuencia de muestreo (f) también necesita los bits por muestra (bps) y el número de canales (n), también proporcionados por AudioFormat. Durante un segundo de audio, necesita bps * n * f/8 bytes. – eljenso

+0

Gracias Elijenso. Pude averiguar la cantidad de bytes necesarios para 2 segundos de audio. Ahora, estoy tratando de escribir los bytes de lectura usando el método de escritura de AudioSystem. Sin embargo, uno de los argumentos de entrada es AudioInputStream. No puedo crear ese objeto en base a los bytes leídos. Cualquier puntero sería realmente útil. ¡Gracias! – Snehal

0

Si no le importa la longevidad de su código, Quicktime para Java es una buena opción para los medios. Se ejecuta en Windows y Mac y leerá y escribirá casi cualquier formato de audio (y video). La desventaja es que Apple no lo ha soportado durante años, por lo que, si bien funciona, está invirtiendo en una tecnología en extinción.

1

También puede buscar el specification for a wav file, que es realmente básico y simple. Y luego binario lea el archivo y guárdelo nuevamente en bits más pequeños.

Creo que es una mejor experiencia de aprendizaje hacerlo de esta manera en lugar de confiar siempre en las bibliotecas.

+1

También necesitarás saber cómo formatear el encabezado para los trozos más pequeños, dado el formato del trozo más grande. No es una tarea 'simple' pero tampoco es demasiado difícil.Sin embargo, definitivamente necesitamos investigar las especificaciones. –

Cuestiones relacionadas