【问题标题】:Concatenation of two WAV files failed连接两个 WAV 文件失败
【发布时间】:2012-11-03 03:05:04
【问题描述】:

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

【问题讨论】:

  • 尝试了您的代码,对我来说效果很好。请按照@AndrewThompson 的建议检查两个文件的格式。 PS。 44字节是wav头的长度。
  • @AndrewThompson 原始样本只是从网上下载的。它们是从“a”到“b”和“0”到“9”的简单 mp3 声音。
  • @AndrewThompson 我尝试了一个名为 audacity(audio-editor) 的软件来解决问题。最后它正在工作。非常感谢所有的帮助。我很感激。没有帮助是不可能的。
  • @AndrewThompson 完成 :-)

标签: java javasound javax.sound.sampled


【解决方案1】:

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

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

【讨论】:

  • 这个我已经试过了。它在尝试播放文件时提供相同的输出。我的意思是它不起作用。输出大小合适。仍然无法播放输出文件。
  • 问题不在于编解码器。因为我用所有可能的编解码器下载了所有可能的播放器。它绝对是代码的输出。我认为没有创建适当的输出。
  • 什么是SequenceAudioInputStream?
  • 抱歉,我已经添加了我的 SequenceAudioInputStream 类。请检查并更改为您想要的方式。
  • @AndrewThompson 我的包中已经有来自 jresources.org 网站的 SequenceAudioInputStream。但是用起来有错吗?
【解决方案2】:

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 被认为足以理解语音,为此您需要将组合声音的字节提供给浏览器 - 因此减小它的大小至关重要。

【讨论】:

    猜你喜欢
    • 2011-02-22
    • 2014-05-07
    • 1970-01-01
    • 2016-08-19
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多