DataLine 和 (Output|Input)Stream 的区别?

Posted

技术标签:

【中文标题】DataLine 和 (Output|Input)Stream 的区别?【英文标题】:The difference between DataLine and (Output|Input)Stream? 【发布时间】:2011-02-22 08:36:48 【问题描述】:

我现在正在使用 Java 进行声音处理。在我的项目中,我必须处理流。所以我有很多员工要处理DataLineOutputStreamInputStream。 但对我来说,它们太相似了:(

有人可以帮我解答这个问题吗?提前致谢! 下面是我使用的一些代码:

        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

spring cloud Stream input和output重名报错

Verilog语法--Gate门