2013-05-08 4 views
0

Je sais que cette question est déjà discutée mais après avoir beaucoup googlé je ne peux pas trouver la solution pourquoi deux fichiers fusionnés .wav n'est pas jouable? Je fusionne deux fichiers .wav en un seul fichier .Mais le fichier fusionné est en cours de lecture pendant une seconde. Rien d'autre.Après cliquez sur le bouton de lecture, il joue pendant une seconde.S'il vous plaît me donner une suggestion ou vérifier mon code pour identifier le problème.Merci à l'avance.Le code que j'utilise deux fusionner deux fichiers est comme ci-dessous:Comment fusionner deux fichier audio .wav

private static final int RECORDER_SAMPLERATE = 44100; 
private static final int RECORDER_BPP = 16; 
private void CombineWaveFile(String file1, String file2, String path) { 
    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[8192]; 

    try { 
     in1 = new FileInputStream(file1); 
     in2 = new FileInputStream(file2); 
     File file_path = new File(path); 
     file_path.setReadable(true); 
     out = new FileOutputStream(file_path); 

     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(); 
     Log.e("mPAthTemp Combine", file_path.toString()); 
     Log.e("mFileSecond Combine", file2); 

     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); 
} 

}

code J'utilise pour lire le fichier audio est comme ci-dessous:

private void startPlaying(String file_path) { 
    mPlayer = new MediaPlayer(); 
    try { 
     Log.e("playing", file_path); 
     mPlayer.setDataSource(file_path); 
     mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mPlayer.prepare(); 

     mPlayer.start(); 
     mPlayer.setOnCompletionListener(new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       // TODO Auto-generated method stub 
       showToast("Complete"); 
       setProgressBar(false); 
       mButtonStart.setEnabled(true); 
       mButtonStop.setEnabled(false); 
       stopPlaying(); 
      } 
     }); 

    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

Donne-moi une solution pourquoi cette happen.Thanks ..

+0

Vérifiez ce lien;) [Fusion de deux ou plusieurs fichiers wav dans Android] [1] [1]: http://stackoverflow.com/questions/11452464/merging-two-or-more- wav-files-in-android –

+0

J'utilise simplement le même code donné dans l'URL que vous avez fournie. @ Jose Montero – AndiM

Répondre

0

Je ne sais pas ce qui cause spécifiquement votre problème, mais ce code est jonché de bogues, une combinaison de ce qui pourrait expliquer votre problème. Voici ce que j'ai repéré par l'inspection:

  • Il suppose que les fichiers entrants sont le même format (16 bits stéréo, 44100, etc) sans vérification.
  • Il n'analyse pas du tout les fichiers entrants. Ainsi, il traite les en-têtes des fichiers entrants comme des données audio et les ajoute au fichier sortant (yikes!). Ceci est particulièrement étrange étant donné qu'il écrit soigneusement un en-tête pour le fichier de sortie.
  • Il ne vérifie pas la valeur de retour de read(), écrivant ainsi des blocs plus grands que ceux lus dans certains cas (en particulier le dernier bloc de chaque fichier entrant).

Vous avez peut-être besoin d'un nouvel exemple de code. JSResources pourrait être un bon point de départ.

Questions connexes