DataLine 和 (Output|Input)Stream 的区别?
Posted
技术标签:
【中文标题】DataLine 和 (Output|Input)Stream 的区别?【英文标题】:The difference between DataLine and (Output|Input)Stream? 【发布时间】:2011-02-22 08:36:48 【问题描述】:我现在正在使用 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 类型的线还没有连接到任何混音器,那么我们怎么知道它是用于哪个混音器的???
【问题讨论】:
【参考方案1】:DataLine
是一个与在 Java 中处理采样声音(也称为 PCM 数据)相关的接口。我真的不知道很多。
OutputStream
是一个接口,它表示可以将字节写入其中的任何东西。 OutputStream
的一个简单示例是 FileOutputStream
:写入该流的所有字节都将写入打开它的文件。
InputStream
是另一端:它是一个接口,表示可以从中读取字节的任何内容。 InputStream
的一个简单示例是 FileInputStream
:它可用于从文件中读取数据。
因此,如果您要从硬盘读取音频数据,您最终会使用FileInputStream
来读取数据。如果您对其进行操作,然后想将结果数据写回硬盘,则可以使用FileOutputStream
来进行实际写入。
【讨论】:
谢谢约阿希姆。事实上,我应该实时处理声音流。就好像我应该先用电脑的麦克风捕捉声音,然后根据捕捉到的声音信息的处理结果做一些动作。 虽然声音 api 中的 Line 和子接口是接口,但 InputStream 和 OutputStream 是具体类,它们只实现某些接口,如可关闭和可冲洗。【参考方案2】:InputStream
表示一个字节流,我们可以读取字节一个一个(或块)直到它为空。 OutputStream
是另一个方向 - 我们写入个字节一个为一个(或以块为单位),直到我们没有更多要写入的内容。
流用于发送或接收非结构化字节数据。
DataLine
处理音频数据,换言之,具有特殊含义的字节。并且它提供了一些特殊的方法来控制线路(开始/停止),获取音频数据的实际格式和一些其他特性。
【讨论】:
您好 Andreas,感谢您的回答,我在帖子中添加了一些内容。你能看一下吗?非常感谢!以上是关于DataLine 和 (Output|Input)Stream 的区别?的主要内容,如果未能解决你的问题,请参考以下文章
在 Angular 组件中与 @Input 和 @Output 共享数据
AngularJs注解之----@input和@output
使用@input 和@output 在角度组件之间传输数据[重复]
处理 Angular 2 中动态创建的组件的 @Input 和 @Output