Performance 重叠两个音频文件

Performance 重叠两个音频文件,performance,audio,Performance,Audio,请有人告诉我如何重叠两个音频文件,并生成一个音频文件从他们。我正在尝试以下代码,但无法打开保存的文件 package com.example.audiomix; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOExcepti

请有人告诉我如何重叠两个音频文件,并生成一个音频文件从他们。我正在尝试以下代码,但无法打开保存的文件

package com.example.audiomix;

    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;

    import android.app.Activity;
    import android.media.AudioFormat;
    import android.media.AudioManager;
    import android.media.AudioTrack;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;

    public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


  // MediaPlayer mediaPlayer=MediaPlayer.create(getApplicationContext(),getAssets()+"")

    try {
        mixSound();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }



}

private void mixSound()  {
     try {
    AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, 44100, AudioTrack.MODE_STREAM);

    //        Uri url = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.one);
    //        System.out.println("MainActivity.mixSound() url1"+url.toString());
    //        File file = new File(url.toString());
    //        Uri url2 = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.two);
    //        System.out.println("MainActivity.mixSound() url1"+url2.toString());
    //        File file2 = new File(url2.toString());

    //        InputStream in1=new FileInputStream(file);      
    //        InputStream in2=new FileInputStream(file2); 

    //        int rid = getResources().getIdentifier(getPackageName() + ":raw/one.mp3" , null, null);  
    //      //get the file as a stream  
    //      InputStream in1 = getResources().openRawResource(rid);
    ////        InputStream in1=new FileInputStream(""); 
    //      
    //      int rid2 = getResources().getIdentifier(getPackageName() + ":raw/two.mp3" , null, null);  
    //      //get the file as a stream  
    //      InputStream in2 = getResources().openRawResource(rid2);
    //      
    ////      InputStream in2=new FileInputStream(getResources().openRawResource(R.raw.one).toString()); 


    InputStream in1 = getApplicationContext().getResources().openRawResource(R.raw.media);

    InputStream in2 = getApplicationContext().getResources().openRawResource(R.raw.media1);


    byte[] music1 = null;
    music1= new byte[in1.available()]; 
    music1=convertStreamToByteArray(in1);
    in1.close();


    byte[] music2 = null;
    music2= new byte[in2.available()]; 
    music2=convertStreamToByteArray(in2);
    in2.close();

    byte[] output = new byte[music2.length];

    audioTrack.play();
    int j=0;
    for(int i=0; i < output.length-1; i++){
        float mixed;
       if(j<music1.length-1){
        float samplef1 = music1[j] / 128.0f;      //     2^7=128
        float samplef2 = music2[i] / 128.0f;
        mixed = samplef1 + samplef2;
        j++;
         }else{
             float samplef2 = music2[i] / 128.0f;
              mixed = samplef2; 
         }

          float samplef1 = music1[j] / 128.0f;      //     2^7=128
          float samplef2 = music2[i] / 128.0f;
          mixed = samplef1 + samplef2;

        // reduce the volume a bit:
        mixed *= 0.8;
        // hard clipping
        if (mixed > 1.0f) mixed = 1.0f;

        if (mixed < -1.0f) mixed = -1.0f;

        byte outputSample = (byte)(mixed * 128.0f);
        output[i] = outputSample;

    }   //for loop
 audioTrack.write(output, 0, output.length);










    //convert array of bytes into file
    FileOutputStream fileOuputStream = 
              new   FileOutputStream(Environment.getExternalStorageDirectory()+"/abc.wav"); 
    fileOuputStream.write(output);
    fileOuputStream.close();
    System.out.println("MainActivity.mixSound()==>Done");
    System.out.println("Done");
    }catch(Exception e){
      //  e.printStackTrace();
    System.out.println("MainActivity.mixSound()==>"+e);
    }

}
public static byte[] convertStreamToByteArray(InputStream is) throws IOException {



    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buff = new byte[10240];
    int i = Integer.MAX_VALUE;
    while ((i = is.read(buff, 0, buff.length)) > 0) {
        baos.write(buff, 0, i);
    }

    return baos.toByteArray(); // be sure to close InputStream in calling function

}
package com.example.audiomix;
导入java.io.ByteArrayOutputStream;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入android.app.Activity;
导入android.media.AudioFormat;
导入android.media.AudioManager;
导入android.media.AudioTrack;
导入android.net.Uri;
导入android.os.Bundle;
导入android.os.Environment;
公共类MainActivity扩展了活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//MediaPlayer MediaPlayer=MediaPlayer.create(getApplicationContext(),getAssets()+“”)
试一试{
混音();
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
私人混音{
试一试{
AudioTrack AudioTrack=新的AudioTrack(AudioManager.STREAM\u MUSIC,44100,AudioFormat.CHANNEL\u OUT\u立体声,AudioFormat.ENCODING\u PCM\u 16位,44100,AudioTrack.MODE\u STREAM);
//uriurl=Uri.parse(“android.resource://”+getPackageName()+“/”+R.raw.one);
//System.out.println(“MainActivity.mixSound()url1”+url.toString());
//File File=新文件(url.toString());
//Uri url2=Uri.parse(“android.resource://”+getPackageName()+“/”+R.raw.two);
//System.out.println(“MainActivity.mixSound()url1”+url2.toString());
//File file2=新文件(url2.toString());
//InputStream in1=新文件InputStream(文件);
//InputStream in2=新文件InputStream(文件2);
//int rid=getResources().getIdentifier(getPackageName()+“:raw/one.mp3”,null,null);
////将文件作为流获取
//InputStreamin1=getResources().openRawResource(rid);
////InputStream in1=新文件InputStream(“”);
//      
//int rid2=getResources().getIdentifier(getPackageName()+“:raw/two.mp3”,null,null);
////将文件作为流获取
//InputStream in2=getResources().openRawResource(rid2);
//      
////InputStream in2=新文件InputStream(getResources().openRawResource(R.raw.one).toString());
InputStream in1=getApplicationContext().getResources().openRawResource(R.raw.media);
InputStream in2=getApplicationContext().getResources().openRawResource(R.raw.media1);
字节[]music1=null;
music1=新字节[in1.available()];
music1=转换流到字节数组(in1);
in1.close();
字节[]music2=null;
music2=新字节[in2.available()];
music2=转换流到字节数组(in2);
in2.close();
字节[]输出=新字节[music2.length];
音轨播放();
int j=0;
for(int i=0;iDone”);
系统输出打印项次(“完成”);
}捕获(例外e){
//e.printStackTrace();
System.out.println(“MainActivity.mixSound()==>”+e);
}
}
公共静态字节[]convertStreamToByteArray(InputStream is)引发IOException{
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
字节[]buff=新字节[10240];
int i=整数的最大值;
而((i=is.read(buff,0,buff.length))>0){
写入(buff,0,i);
}
返回baos.toByteArray();//确保在调用函数时关闭InputStream
}
}

我试图先将音频文件转换成字节数组。然后我把它保存在SD卡上。
生成的文件已保存,但当我尝试播放保存的文件时,它不会播放

这是因为两个字节数组都有原始音频字节和头,所以当你混合它们时,你应该得到一个糟糕的音频文件。但你没有。这意味着你正在混合的文件不是具有相同属性的文件,换句话说,它们的格式不同。

显然,要合并两个声音,它需要具有相同的属性,你能给出一个正确的答案吗?你得到什么帮助了吗?我也被同样的事情绊住了,但却无法摆脱。有什么帮助吗?