3

我有这个简单的代码来连接两个 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();
        }
    }
}
4

2 回答 2

2

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

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

更新

检查SequenceAudioInputStream

于 2012-11-14T15:43:12.007 回答
1

clip1.getFormat()返回-->

MPEG2L3 24000.0 Hz, unknown bits per sample, mono, unknown frame size, 41.666668 frames/second

clip2.getFormat()返回-->

MPEG2L3 24000.0 Hz, unknown bits per sample, mono, unknown frame size, 41.666668 frames/second

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

  1. 能听懂破碎的MP3,和..
  2. 将写入有效的 WAV 或 AU。

如果您可以在转换过程中将它们转换为 8 位单声道和 8KHz,它可能会将byte[]大小减少 6 到 1 倍。8KHz 被认为足以理解语音,为此您需要提供组合的字节对浏览器发出声音 - 所以减小它的大小是至关重要的。

于 2012-11-15T10:57:37.233 回答