【问题标题】:How can I write the contents of a SourceDataLine to a file?如何将 SourceDataLine 的内容写入文件?
【发布时间】:2012-03-05 21:01:33
【问题描述】:

我正在修改一个播放音频数据的应用程序,以将数据写入文件。按照目前的实现,一个字节数组是动态填充的,每次填充时这个缓冲区的内容都会写入一个 SourceDataLine。我基本上想将该缓冲区写入指定格式的文件。

我已经阅读了this official tutorial 并发现了这段代码,用于将音频数据写入文件:

File fileOut = new File(someNewPathName);
AudioFileFormat.Type fileType = fileFormat.getType();
if (AudioSystem.isFileTypeSupported(fileType, 
    audioInputStream)) {
  AudioSystem.write(audioInputStream, fileType, fileOut);
}

我从 API 文档中看到,我可以使用 TargetDataLine 构造 AudioInputStream,但在我的情况下,我有一个 SourceDataLine。我不知道如何从我的字节数组中获取数据到 TargetDataLine,因为它实现了 read() 方法而不是 write()。该文档和其他文档中 AudioInputStream 的其他用途将其视为从文件中读取 的一种方式,因此我对它与 AudioSystem.write() 的使用感到有些困惑。

那么,如何从 SourceDataLine 或直接从缓冲区中获取数据到 TargetDataLine 或 AudioInputStream 中,以便将其写入文件?

【问题讨论】:

  • 您使用的解决方案是什么?您能否将正在播放/收听的内容写入文件中?
  • @coding_idiot 音频只是一个音调序列,所以我能够从音调发生器复制它们比以编程方式复制它们更容易

标签: java audio file-io javasound


【解决方案1】:
  1. 使用byte[] 建立ByteArrayInputStream
  2. 将 BAIS 提供给AudioSystem.getAudioInputStream(InputStream)
  3. AudioSystem.write(..) 中使用 AIS

【讨论】:

  • 用这个替换对 SourceDataLine.write() 的调用后,我在第 3 步得到了 UnsupportedAudioFileException:“无法从输入流中获取音频输入流”。为什么数据对写入 SourceDataLine 有效,但对创建 AudioInputStream 无效?
  • SSCCE 在这种情况下并不可行。我转向了一个不同的解决方案,但这是我最初面临的问题的答案,所以我接受了。
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 2011-03-05
  • 2014-04-07
  • 2022-01-09
  • 1970-01-01
  • 2013-08-01
  • 2010-11-09
  • 2016-09-28
相关资源
最近更新 更多