Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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 连接两个WAV文件失败_Java_Javasound_Javax.sound.sampled - Fatal编程技术网

Java 连接两个WAV文件失败

Java 连接两个WAV文件失败,java,javasound,javax.sound.sampled,Java,Javasound,Javax.sound.sampled,我有这个简单的代码来连接两个wav文件。它非常简单,代码运行时没有任何错误。但是输出文件有一个问题。生成的输出文件无法播放,令人惊讶的是,它的大小只有44字节,而我的输入文件“a.wav”和“b.wav”的大小都超过500Kb 这是我的密码: import java.io.File; import java.io.IOException; import java.io.SequenceInputStream; import javax.sound.sampled.AudioFileFormat;

我有这个简单的代码来连接两个wav文件。它非常简单,代码运行时没有任何错误。但是输出文件有一个问题。生成的输出文件无法播放,令人惊讶的是,它的大小只有44字节,而我的输入文件“a.wav”和“b.wav”的大小都超过500Kb

这是我的密码:

import java.io.File;
import java.io.IOException;
import java.io.SequenceInputStream;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;

public class WavConcat {
    public static void main(String[] args) {
        String wFile1 = "./sounds/a.wav";
        String wFile2 = "./sounds/b.wav";

        try {
            AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File(wFile1));
            AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(wFile2));

            AudioInputStream appendedFiles = 
                            new AudioInputStream(
                                new SequenceInputStream(clip1, clip2),     
                                clip1.getFormat(), 
                                clip1.getFrameLength() + clip2.getFrameLength());

            AudioSystem.write(appendedFiles, 
                            AudioFileFormat.Type.WAVE,new File("./sounds/ab.wav"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

试试这种结构。这对我有用

List audioInputStreamList = new ArrayList();

    String wFile1 = "./sounds/a.wav";
    String wFile2 = "./sounds/b.wav";

 AudioInputStream audioInputStream1 = AudioSystem.getAudioInputStream(new File(wFile1));
 AudioInputStream audioInputStream2 = AudioSystem.getAudioInputStream(new File(wFile2));

 audioInputStreamList.add(audioInputStream1);
 audioInputStreamList.add(audioInputStream2);

 AudioFormat audioFormat = audioInputStream1.getFormat(); // audioInputStream2 format also same

 AudioInputStream udioInputStream = new SequenceAudioInputStream(audioFormat,audioInputStreamList);

 AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE,new File("./sounds/ab.wav"));
更新

查证

clip1.getFormat()
返回-->

clip2.getFormat()
返回-->

这是一种奇怪的格式。我可以想象“每个样本的未知比特数”会引起问题,但MPEG2L3也会引起问题,因为JavaSound没有内置的MP3编码器。似乎它们没有正确编码。尝试将它们加载到声音编辑软件中,并将它们保存为Java声音可以理解的“开箱即用”的WAV或AU类型。希望编辑软件:

  • 能听懂坏了的MP3,而且
  • 将写入有效的WAV或AU

  • 如果在转换过程中可以将其转换为8位单声道和8KHz,则可能会将
    字节[]
    大小减少6到1倍。8KHz被认为足以理解语音,为此,您需要将组合声音的字节发送到浏览器,因此减小其大小至关重要。

    我已经尝试过这种方法。它在尝试播放文件时提供相同的输出。我的意思是它不起作用。输出的大小是适当的。输出文件仍然无法播放。问题不在于编解码器。因为我下载了所有可能的播放器和所有可能的编解码器。这就是代码的输出。我认为没有创建适当的输出。什么是
    SequenceAudioInputStream
    ?对不起,我添加了SequenceAudioInputStream类。请检查并更改为您想要的方式。@AndrewThompson我的软件包中已经有来自jresources.org网站的SequenceAudioInputStream。但是用错了吗?试过你的代码,对我来说很好。请按照@AndrewThompson的建议检查这两个文件的格式。PS.44字节是wav头的长度。@AndrewThompson原始样本只是从互联网上下载的。它们是从“a”到“b”和“0”到“9”的简单mp3声音。@AndrewThompson我尝试了一个名为audacity(音频编辑器)的软件来实现这个技巧。最后它开始工作了。非常感谢你的帮助。我很感激。没有帮助是不可能的。@AndrewThompson Done:-)
    MPEG2L3 24000.0 Hz, unknown bits per sample, mono, unknown frame size, 41.666668 frames/second
    
    MPEG2L3 24000.0 Hz, unknown bits per sample, mono, unknown frame size, 41.666668 frames/second