2012-07-12 35 views
6

Her şeyden önce size android için yeni olduğumu söylemeliyim. İki .wav (ses dosyası) dosyalarını birleştirmek istiyorum. Ben bu konuda googled, javax paketi kullanarak onları birleştirmek kolay ama android üzerinde desteklenmez. Bunu androidde nasıl yapacağımı söyleyebilir misin? Bana yardımcı olabilecek herhangi bir eğitim veya kütüphane önerebilir misin? Thanx öncedenAndroid'de iki veya daha fazla .wav dosyası birleştirme

+1

birleştirmek tarafından tam olarak ne demek oluyor gitmek? Concatenate? Kaplama? – tomfanning

+0

Yani birleştirmek – Harsh

+1

@tomfanning Merhaba. İki .wav dosyasının üstesinden gelmek için yardımcı olabilir misiniz. Snippet için – Harsh

cevap

10

Bir acemi olarak kullanıcı sadece dosyadaki baytları okuyacaktır ve ikinci dosyayla uyuşacaktır !!

Ama bu şekilde çalışmıyor. İki dosya birleştirirken dalga dosya başlığı hakkında çok dikkatli olmanız gerekiyor.Ne yazık ki size yardımcı olacak hazır parçacığım var. İşte

Eğer

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. RECORDER_SAMPLERATE ve RECORDER_BPP tarafından ne demek istiyorsunuz? Değerler ne olması gerektiğinden daha sabit midir? – Harsh

+0

Değer, cihaza göre değişir.Ama benim durumumda değerler 44100 ve 16 –

+1

kodunuzda çalışıyor Vipul. Bir çıktı dosyası (birleştirilmiş dosya) alabiliyorum. Yardım için Thanx – Harsh

İlgili konular