2012-07-12 16 views
6

Antes que nada debo decirte que soy nuevo en Android. Quiero combinar dos archivos .wav (archivo de audio). He buscado en Google, es fácil combinarlos usando el paquete javax pero no es compatible con Android. ¿Puedes decirme cómo hacer esto en Android? ¿Me puede sugerir algún tutorial o biblioteca que pueda ayudar? Gracias por adelantadoFusionando dos o más archivos .wav en android

+1

¿Qué quiere decir por combinar, exactamente? ¿Concatenar? ¿Cubrir? – tomfanning

+0

Me refiero a Concatenate – Harsh

+1

@tomfanning Hola. ¿Puedes ayudar a superponer dos archivos .wav? – Harsh

Respuesta

10

Como novato, el usuario simplemente leerá los bytes del archivo y lo concat con el segundo archivo !!

Pero no funciona de esa manera. Debe tener mucho cuidado con el encabezado del archivo de onda mientras combina dos archivos. Desafortunadamente, tengo listo un fragmento que lo ayudará.

Aquí tiene

private void CombineWaveFile(String file1, String file2) { 
    FileInputStream in1 = null, in2 = null; 
    FileOutputStream out = null; 
    long totalAudioLen = 0; 
    long totalDataLen = totalAudioLen + 36; 
    long longSampleRate = RECORDER_SAMPLERATE; 
    int channels = 2; 
    long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels/8; 

    byte[] data = new byte[bufferSize]; 

    try { 
     in1 = new FileInputStream(file1); 
     in2 = new FileInputStream(file2); 

     out = new FileOutputStream(getFilename3()); 

     totalAudioLen = in1.getChannel().size() + in2.getChannel().size(); 
     totalDataLen = totalAudioLen + 36; 

     WriteWaveFileHeader(out, totalAudioLen, totalDataLen, 
     longSampleRate, channels, byteRate); 

     while (in1.read(data) != -1) { 

      out.write(data); 

     } 
     while (in2.read(data) != -1) { 

      out.write(data); 
     } 

     out.close(); 
     in1.close(); 
     in2.close(); 

     Toast.makeText(this, "Done!!", Toast.LENGTH_LONG).show(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private void WriteWaveFileHeader(FileOutputStream out, long totalAudioLen, 
long totalDataLen, long longSampleRate, int channels, long byteRate) 
throws IOException { 

    byte[] header = new byte[44]; 

    header[0] = 'R'; 
    header[1] = 'I'; 
    header[2] = 'F'; 
    header[3] = 'F'; 
    header[4] = (byte)(totalDataLen & 0xff); 
    header[5] = (byte)((totalDataLen >> 8) & 0xff); 
    header[6] = (byte)((totalDataLen >> 16) & 0xff); 
    header[7] = (byte)((totalDataLen >> 24) & 0xff); 
    header[8] = 'W'; 
    header[9] = 'A'; 
    header[10] = 'V'; 
    header[11] = 'E'; 
    header[12] = 'f'; 
    header[13] = 'm'; 
    header[14] = 't'; 
    header[15] = ' '; 
    header[16] = 16; 
    header[17] = 0; 
    header[18] = 0; 
    header[19] = 0; 
    header[20] = 1; 
    header[21] = 0; 
    header[22] = (byte) channels; 
    header[23] = 0; 
    header[24] = (byte)(longSampleRate & 0xff); 
    header[25] = (byte)((longSampleRate >> 8) & 0xff); 
    header[26] = (byte)((longSampleRate >> 16) & 0xff); 
    header[27] = (byte)((longSampleRate >> 24) & 0xff); 
    header[28] = (byte)(byteRate & 0xff); 
    header[29] = (byte)((byteRate >> 8) & 0xff); 
    header[30] = (byte)((byteRate >> 16) & 0xff); 
    header[31] = (byte)((byteRate >> 24) & 0xff); 
    header[32] = (byte)(2 * 16/8); 
    header[33] = 0; 
    header[34] = RECORDER_BPP; 
    header[35] = 0; 
    header[36] = 'd'; 
    header[37] = 'a'; 
    header[38] = 't'; 
    header[39] = 'a'; 
    header[40] = (byte)(totalAudioLen & 0xff); 
    header[41] = (byte)((totalAudioLen >> 8) & 0xff); 
    header[42] = (byte)((totalAudioLen >> 16) & 0xff); 
    header[43] = (byte)((totalAudioLen >> 24) & 0xff); 

    out.write(header, 0, 44); 
} 
+1

Vipul thanx para el fragmento. ¿Qué quiere decir con RECORDER_SAMPLERATE y RECORDER_BPP? Si son constantes de lo que deben ser los valores? – Harsh

+0

El valor varía de acuerdo con el dispositivo.Pero en mi caso los valores son 44100 y 16 –

+1

Su código funciona bien Vipul. Puedo obtener un archivo de salida (archivo fusionado). Gracias por la ayuda – Harsh