Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 混合波文件_Java_Android_Audio_Wave - Fatal编程技术网

Java 混合波文件

Java 混合波文件,java,android,audio,wave,Java,Android,Audio,Wave,我不能混合两个音频扩展文件wav。我的工作: byte[] bufData1 = null; byte[] bufData2 = null; ArrayList<Byte> bufData3 = new ArrayList<Byte>(); 混合原始音频数据字节 public void bootloadInputData(String p1, String p2) throws IOException { bufData1 = bootloadRead

我不能混合两个音频扩展文件wav。我的工作:

byte[] bufData1 = null;
byte[] bufData2 = null;
ArrayList<Byte> bufData3 = new ArrayList<Byte>();
混合原始音频数据字节

 public void bootloadInputData(String p1, String p2) throws IOException {
        bufData1 = bootloadReadFileByte(p1);
        bufData2 = bootloadReadFileByte(p2);
        System.arraycopy(bufData1, 44, bufData1, 0, (bufData1.length - 44));
        System.arraycopy(bufData2, 44, bufData2, 0, (bufData2.length - 44));
 }

 public byte[] bootloadReadFileByte(String path) throws IOException{
    ByteArrayOutputStream out = null;
    InputStream input = null;
    try{
        out = new ByteArrayOutputStream();
        input = new BufferedInputStream(new FileInputStream(path));
        int data = 0;
        while((data = input.read()) != -1){
            out.write(data);
        }
    }
    finally{
        if(null != input){
            input.close();
        }
        if(null != out){
            out.close();
        }
    }
    return out.toByteArray();
}
public void bootloadOutputData() throws IOException {
        for(int i = 0; i < ((bufData1.length + bufData2.length) / 4); i += 4) {
            if(i < bufData1.length){
                bufData3.add(bufData1[i]);
                bufData3.add(bufData1[i+1]);
                bufData3.add(bufData1[i+2]);
                bufData3.add(bufData1[i+3]);
            }
            if(i < bufData2.length){
                bufData3.add(bufData2[i]);
                bufData3.add(bufData2[i+1]);
                bufData3.add(bufData2[i+2]);
                bufData3.add(bufData2[i+3]);
            }
        }
    }
public void bootloadOutputData()引发IOException{
对于(int i=0;i<((bufData1.length+bufData2.length)/4);i+=4){
如果(i
创建新文件,填写标题和原始音频数据。

private void bootloadCreateWaveMix(String p1, String p2, String p3) throws IOException {
    int size1 = 0;
    int size2 = 0;

    FileInputStream fis1 = null;
    FileInputStream fis2 = null;
    try {
        fis1 = new FileInputStream(p1);
        fis2 = new FileInputStream(p2);
        size1 = fis1.available();
        size2 = fis2.available();
    } finally {
        if(fis1 != null){
            fis1.close();
        }
        if(fis2 != null){
            fis2.close();
        }
    }

    int mNumBytes = (size1 + size2);

    DataOutputStream out = null;
    try {
        out = new DataOutputStream(new FileOutputStream(p3));
        writeId(out, "RIFF");
        writeInt(out, 36 + mNumBytes);
        writeId(out, "WAVE");

        writeId(out, "fmt ");
        writeInt(out, 16);
        writeShort(out, (short) 1);
        writeShort(out, (short) 4);
        writeInt(out, (int) 44100);
        writeInt(out, 2 * 44100 * 16 / 8);
        writeShort(out, (short)(2 * 16 / 8));
        writeShort(out, (short) 16);

        writeId(out, "data");
        writeInt(out, mNumBytes);

        out.write(toByteArray(bufData3));
    } finally {
        if(out != null){
            out.close();
        }
    }
}

private static void writeId(OutputStream out, String id) throws IOException {
    for (int i = 0; i < id.length(); i++) out.write(id.charAt(i));
}

private static void writeInt(OutputStream out, int val) throws IOException {
    out.write(val >> 0);
    out.write(val >> 8);
    out.write(val >> 16);
    out.write(val >> 24);
}

private static void writeShort(OutputStream out, short val) throws IOException {
    out.write(val >> 0);
    out.write(val >> 8);
}

public static byte[] toByteArray(ArrayList<Byte> in) {
    byte[] data = new byte[in.size()];
    for (int i = 0; i < data.length; i++) {
        data[i] = (byte) in.get(i);
    }
    return data;
}
private void bootloadCreateWaveMix(字符串p1、字符串p2、字符串p3)引发IOException{
int size1=0;
int size2=0;
FileInputStream fis1=null;
FileInputStream fis2=null;
试一试{
fis1=新文件输入流(p1);
fis2=新文件输入流(p2);
size1=fis1.available();
size2=fis2.available();
}最后{
如果(fis1!=null){
fis1.关闭();
}
如果(fis2!=null){
fis2.close();
}
}
int mNumBytes=(大小1+2);
DataOutputStream out=null;
试一试{
out=新数据输出流(新文件输出流(p3));
减记(去掉“RIFF”);
写入(输出,36+兆字节);
减记(输出,“波”);
减记(转出,“fmt”);
减记(外,16);
减记(外,(短)1);
减记(外,(短)4);
注销(输出,(内部)44100);
减记(外,2*44100*16/8);
减记(外,(短)(2*16/8));
减记(外,(短)16);
writeId(输出,“数据”);
写入(输出,百万字节);
out.write(toByteArray(bufData3));
}最后{
if(out!=null){
out.close();
}
}
}
私有静态void writeId(OutputStream out,字符串id)引发IOException{
for(int i=0;i>0);
out.write(val>>8);
out.write(val>>16);
out.write(val>>24);
}
私有静态void writeShort(OutputStream out,short val)引发IOException{
out.write(val>>0);
out.write(val>>8);
}
公共静态字节[]toByteArray(ArrayList in){
字节[]数据=新字节[in.size()];
对于(int i=0;i
问题:

此代码无法正确创建计算机无法创建的文件 播放,但设备可以。繁殖不好,有某种 合并文件末尾的干涉。此外,播放在以下时间结束: 第一个文件结束,即使第二个文件比第一个文件大 一个。另一个问题与渠道的想法是两个立体声 文件,在标题中我指出4个生命,尽管2个。档案 将始终为44100/16位/立体声


如果我理解正确,您需要执行以下操作:

  • 给定2个输入WAV文件,将它们混合到一个WAV文件中
  • 输出的内容将是同时播放的输入文件,而不是一个接一个地播放
  • 新文件的长度将是最长输入文件的长度
  • 所有文件,输入和输出,16位,立体声44100Hz
  • 如果是这样的话,下面是你的一些错误:

  • 您需要解析传入的文件,这样您就不会将它们的头作为音频数据读取(不要因为您已经知道音频的格式而跳过此步骤。您需要读取标题以确认数据格式并准确确定输入中的样本数。另外,请注意,2/16/44100 WAV文件可以有不同大小的标题,因为它们可以包含不同的块,所以您不能跳过X字节和n读取文件-必须解析头!)
  • 如果WAV文件都是16位的,您需要将传入的数据从字节转换为短字节(注意,这不是一个简单的类型转换——每个短字节必须包含2个字节。我相信您可以使用
    DataInputStream
    来实现这一点,但一定要考虑到endianness——WAV文件是小endian,Java是大endian)。获得代表样本的短片后,对单独文件中的短片进行平均以进行混合。然后必须将平均值转换回字节(
    DataOutputStream
    )以保存生成的文件。当一个文件中的数据用完时,用零代替
  • 您对numBytes的计算是不正确的——它不是两个文件中原始字节的总和,而是更复杂的计算。在您的情况下,您希望它等于以下值:

  • <>我强烈要求你考虑使用一个像JMF这样的库来处理1和2。< /P> < P>如果我理解正确,你想做以下事情:

  • 给定2个输入WAV文件,将它们混合到一个WAV文件中
  • 输出的内容将是同时播放的输入文件,而不是一个接一个地播放
  • 新文件的长度将是最长输入文件的长度
  • 所有文件,输入和输出,16位,立体声44100Hz
  • 如果是这样的话,下面是你的一些错误:

  • 您需要解析传入的文件,这样您就不会将它们的头作为音频数据读取(不要因为您已经知道音频的格式而跳过此步骤。您需要读取标题以确认数据格式并准确确定输入中的样本数。另外,请注意,2/16/44100 WAV文件可以具有不同大小的标题,因为它们可以包含不同的块,因此您可以
     n1 = number of samples in file 1
     n2 = number of samples in file 2
     n = MAX( n1 + n2 )
     numBytes = n * (number of channels) * (number of bytes per channel) = n * 2 * 2