【问题标题】:Java Sound Api: Wav file not playing after saving recording on diskJava Sound Api:在磁盘上保存录音后不播放 Wav 文件
【发布时间】:2011-12-15 21:32:43
【问题描述】:

我正在用麦克风录制声音并将其作为 .wav 文件保存到磁盘。

我不能用 Media Player 播放 wav 文件?这正常吗?

AudioFormat format = new AudioFormat(
                AudioFormat.Encoding.PCM_SIGNED,
                44100.0F, 16, 2, 4, 44100.0F, false);
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); // format is an AudioFormat object

    // Obtain and open the line.
    try {
        targetLine = (TargetDataLine) AudioSystem.getLine(info);
        targetLine.open(format);
        targetLine.start();
        ByteArrayOutputStream out  = new ByteArrayOutputStream();
        int numBytesRead;
        byte[] data = new byte[targetLine.getBufferSize() / 5];

        targetLine.start();

        while (recording) {
           numBytesRead =  targetLine.read(data, 0, data.length);
           out.write(data, 0, numBytesRead);
           System.out.println(Arrays.toString(data));
        }     


        File fileOut = new File("C:\\audio\\audio6.wav");
        AudioInputStream ais = new AudioInputStream(targetLine);

        if (AudioSystem. isFileTypeSupported(AudioFileFormat.Type.WAVE,ais)) {
            AudioSystem.write(ais, AudioFileFormat.Type.WAVE, fileOut);
            System.out.println("writen");
        }   
        targetLine.stop();

        ais.close();

【问题讨论】:

  • 它应该可以工作。文件中有任何数据还是只是垃圾
  • 您没有使用 ByteArrayOutputStream 的内容 - 为什么不呢?
  • @Jon 我正在尝试另一种写法:// OutputStream outputStream = new FileOutputStream(fileOut); // // out.writeTo(outputStream); // outputStream.close(); // out.close();

标签: java audio javasound


【解决方案1】:

如果文件正常工作,您应该可以在媒体播放器中播放该文件。

我建议获取免费音频编辑器 Audacity (http://audacity.sourceforge.net/) 的副本并查看数据。 首先检查文件中是否有一些数据,然后检查您的字节序、位深度和采样率是否正确(切换并查看它们中的任何一个是否会产生明显的噪音)。

如果这不起作用,请尝试从文件而不是麦克风中读取一些样本,然后在它们到达我们的另一端时检查它们是否相同。

如果您还没有找到它,这是一个很好的 Java 音频资源 http://www.jsresources.org/

【讨论】:

    【解决方案2】:

    您正在将记录的数据加载到 ByteArrayOutputStream 中,然后再不对其进行任何操作(正如 Jon Skeet 所指出的那样)。

    当“录音”布尔值为假时,那么你将 TargetDataLine 附加到 AudioInputStream 吗?但如果记录是错误的,那么我假设没有数据通过 TDL。数据是通过 read() 方法从 TDL 中获取的,并且在 while 循环中。

    我认为可以通过 ByteArrayInputStream 制作 AIS,该 AIS 可以由用于从 TDL 收集数据的 ByteArrayOutputStream 制作。

    因此,在记录布尔值变为 false 后,尝试以这种方式制作您的 AIS:

    ByteArrayInputStream bais = new ByteArrayInputStream(out.toByteArray());
    AudioInputStream ais = new AudioInputStream(bais, format, baos.size());
    

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 2010-11-08
      • 1970-01-01
      • 2011-08-05
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多