简体   繁体   English

Android concat 2音频(wav或mp3)文件

[英]Android concat 2 audio (wav or mp3) files

I must concat 2 or more audio (wav or mp3) files and get one audio file. 我必须连接2个或更多音频(wav或mp3)文件并获得一个音频文件。 How can I do that in android? 我怎么能在android中做到这一点? Thanks in advance. 提前致谢。

The below code section will work as how many selections have been made.Selection means how much files are selected. 下面的代码部分将作为已进行的选择的数量。选择表示选择了多少文件。 Put your two wav files in /sdcard0/SSoftAudioFiles/ as 1.wav and 2.wav. 将两个wav文件放在/ sdcard0 / SSoftAudioFiles /中作为1.wav和2.wav。 And Just execute this method. 并且只需执行此方法。

public void SSoftAudCombine()
{
 try {
String[] selection=new String[2];
selection[0]="1.wav";
selection[1]="2.wav";
            DataOutputStream amplifyOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(Environment.getExternalStorageDirectory() + "/SSoftAudioFiles/"  + year +"-"+ month +"-"+ date +"-"+ hour+"-" + min +"-"+ sec+"ME.wav")));
            DataInputStream[] mergeFilesStream = new DataInputStream[selection.length];
            long[] sizes=new long[selection.length];
            for(int i=0; i<selection.length; i++) {
                File file = new File(Environment.getExternalStorageDirectory() + "/SSoftAudioFiles/" +selection[i]);
             sizes[i] = (file.length()-44)/2;
            }
            for(int i =0; i<selection.length; i++) {
                mergeFilesStream[i] =new DataInputStream(new BufferedInputStream(new FileInputStream(Environment.getExternalStorageDirectory() + "/SSoftAudioFiles/" +selection[i])));

                if(i == selection.length-1) {
                    mergeFilesStream[i].skip(24);
                    byte[] sampleRt = new byte[4];
                    mergeFilesStream[i].read(sampleRt);
                    ByteBuffer bbInt = ByteBuffer.wrap(sampleRt).order(ByteOrder.LITTLE_ENDIAN);
                    RECORDER_SAMPLERATE = bbInt.getInt();
                    mergeFilesStream[i].skip(16);
                }
                    else {
                        mergeFilesStream[i].skip(44);
                    }

            }

            for(int b=0; b<selection.length; b++) {
            for(int i=0; i<(int)sizes[b]; i++) {
                 byte[] dataBytes = new byte[2];
                 try {
                 dataBytes[0] = mergeFilesStream[b].readByte();
                 dataBytes[1] = mergeFilesStream[b].readByte();
                 }
                 catch (EOFException e) {
                    amplifyOutputStream.close();
                 }
                 short dataInShort = ByteBuffer.wrap(dataBytes).order(ByteOrder.LITTLE_ENDIAN).getShort();
                 float dataInFloat= (float) dataInShort/37268.0f;


                short outputSample = (short)(dataInFloat * 37268.0f);
                byte[] dataFin = new byte[2];
               dataFin[0] = (byte) (outputSample & 0xff);
               dataFin[1] = (byte)((outputSample >> 8) & 0xff);        
              amplifyOutputStream.write(dataFin, 0 , 2);

            }
            }
            amplifyOutputStream.close();
            for(int i=0; i<selection.length; i++) {
                mergeFilesStream[i].close();
            }

        } catch (FileNotFoundException e) {

            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        }
        long size =0;
        try {
            FileInputStream fileSize = new FileInputStream(Environment.getExternalStorageDirectory() + "/SSoftAudioFiles/"+year +"-"+ month +"-"+ date +"-"+ hour+"-" + min +"-"+ sec+"ME.wav");
            size = fileSize.getChannel().size();
            fileSize.close();
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        final int RECORDER_BPP = 16;

        long datasize=size+36;
        long byteRate = (RECORDER_BPP * RECORDER_SAMPLERATE)/8;
        long longSampleRate = RECORDER_SAMPLERATE;
        byte[] header = new byte[44];


         header[0] = 'R';  // RIFF/WAVE header 
         header[1] = 'I';
         header[2] = 'F';
         header[3] = 'F';
         header[4] = (byte) (datasize & 0xff);
         header[5] = (byte) ((datasize >> 8) & 0xff);
         header[6] = (byte) ((datasize >> 16) & 0xff);
         header[7] = (byte) ((datasize >> 24) & 0xff);
         header[8] = 'W';
         header[9] = 'A';
         header[10] = 'V';
         header[11] = 'E';
         header[12] = 'f';  // 'fmt ' chunk
         header[13] = 'm';
         header[14] = 't';
         header[15] = ' ';
         header[16] = 16;  // 4 bytes: size of 'fmt ' chunk
         header[17] = 0;
         header[18] = 0; 
         header[19] = 0;
         header[20] = 1;  // format = 1
         header[21] = 0;
         header[22] = (byte) 1;
         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) ((RECORDER_BPP) / 8);  // block align
         header[33] = 0;
         header[34] = RECORDER_BPP;  // bits per sample
         header[35] = 0;
         header[36] = 'd';
         header[37] = 'a';
         header[38] = 't';
         header[39] = 'a';
         header[40] = (byte) (size & 0xff);
         header[41] = (byte) ((size >> 8) & 0xff);
         header[42] = (byte) ((size >> 16) & 0xff);
         header[43] = (byte) ((size >> 24) & 0xff);
       // out.write(header, 0, 44); 

        try {
             RandomAccessFile rFile = new RandomAccessFile(Environment.getExternalStorageDirectory() + "/SSoftAudioFiles/"  +year +"-"+ month +"-"+ date +"-"+ hour+"-" + min +"-"+ sec+ "ME.wav", "rw");
            rFile.seek(0);
            rFile.write(header);
            rFile.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

It will concate your audio file and save a combined file in /sdcard0/SSoftAudioFiles/...ME.wav. 它将连接您的音频文件并将组合文件保存在/sdcard0/SSoftAudioFiles/...ME.wav中。

The below code will surely help you to concatinating two audio files. 以下代码肯定会帮助您合并两个音频文件。

     try {
         FileInputStream fis1 = new FileInputStream("/sdcard/MJdangerous.wav");
         FileInputStream fis2 = new FileInputStream("/sdcard/MJBad.wav");
         SequenceInputStream sis = new SequenceInputStream(fis1,fis2);


         FileOutputStream fos = new FileOutputStream(new File("/sdcard/MJdangerousMJBad.wav"));

         int temp;

         try {
             while ((temp = sis.read())!= -1){

                 fos.write(temp);

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




     } catch (FileNotFoundException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM