我正在使用Java进行声音处理。在我的项目中,我必须处理流。所以我有很多工作人员要处理DataLine
和OutputStream
或InputStream
。
但对我来说,它们太相似了:(
有人可以帮我解决这个问题吗?提前致谢! 以下是我使用的一些代码:
TargetDataLine line;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int frameSizeInBytes = format.getFrameSize();
int bufferLengthInFrames = line.getBufferSize() / 8;
int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes;
byte[] data = new byte[bufferLengthInBytes];
int numBytesRead;
try {
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format, line.getBufferSize());
} catch (LineUnavailableException ex) {
shutDown("Unable to open the line: " + ex);
return;
} catch (SecurityException ex) {
shutDown(ex.toString());
return;
} catch (Exception ex) {
shutDown(ex.toString());
return;
}
line.start();
while (thread != null) {
if ((numBytesRead = line.read(data, 0, bufferLengthInBytes)) == -1) {
break;
}
out.write(data, 0, numBytesRead);
}
我已经阅读了类 TargetDataLine 的文档,据说:“'read(byte [] b,int off,int len)'从数据行的输入缓冲区读取音频数据。 “
但我们在哪里定义它?
TargetDataLine类型的线路还没有连接到任何调音台,所以我们怎么知道它的混音器是什么?
答案 0 :(得分:2)
DataLine
是与处理Java中的采样声音(a.k.a PCM数据)相关的接口。我真的不太了解它。
OutputStream
是一个接口,表示可以获取写入字节的任何内容。 OutputStream
的简单示例是FileOutputStream
:写入该流的所有字节都将写入为其打开的文件。
InputStream
是另一端:它是一个接口,表示可以从中读取字节的任何内容。 InputStream
的简单示例是FileInputStream
:它可用于从文件中读取数据。
因此,如果您要从硬盘读取音频数据,最终会使用FileInputStream
来读取数据。如果你操纵它然后想把结果数据写回硬盘,你可以使用FileOutputStream
进行实际的写作。
答案 1 :(得分:1)
InputStream
代表一个字节流,我们可以读取字节一个(或块),直到它为空。 OutputStream
是另一个方向 - 我们写字节一个(或块),直到我们没有更多的东西要写。
Streams用于发送或接收非结构化字节数据。
DataLine
处理音频数据,换句话说,具有特殊含义的字节。它提供了一些特殊的方法来控制线路(启动/停止),获取音频数据的实际格式和其他一些特性。