【问题标题】:The difference between DataLine and (Output|Input)Stream?DataLine 和 (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 类型的线还没有连接到任何混音器,那么我们怎么知道它是用于哪个混音器的???

【问题讨论】:

    标签: java stream


    【解决方案1】:

    DataLine 是一个与在 Java 中处理采样声音(也称为 PCM 数据)相关的接口。我真的不知道很多。

    OutputStream 是一个接口,它表示可以将字节写入其中的任何东西。 OutputStream 的一个简单示例是 FileOutputStream:写入该流的所有字节都将写入打开它的文件。

    InputStream 是另一端:它是一个接口,表示可以从中读取字节的任何内容。 InputStream 的一个简单示例是 FileInputStream:它可用于从文件中读取数据。

    因此,如果您要从硬盘读取音频数据,您最终会使用FileInputStream 来读取数据。如果您对其进行操作,然后想将结果数据写回硬盘,则可以使用FileOutputStream 来进行实际写入。

    【讨论】:

    • 谢谢约阿希姆。事实上,我应该实时处理声音流。就好像我应该先用电脑的麦克风捕捉声音,然后根据捕捉到的声音信息的处理结果做一些动作。
    • 虽然声音 api 中的 Line 和子接口是接口,但 InputStream 和 OutputStream 是具体类,它们只实现某些接口,如可关闭和可冲洗。
    【解决方案2】:

    InputStream 表示一个字节流,我们可以读取字节一个一个(或块)直到它为空。 OutputStream 是另一个方向 - 我们写入个字节一个为一个(或以块为单位),直到我们没有更多要写入的内容。

    流用于发送或接收非结构化字节数据。

    DataLine 处理音频数据,换言之,具有特殊含义的字节。并且它提供了一些特殊的方法来控制线路(开始/停止),获取音频数据的实际格式和一些其他特性。

    【讨论】:

    • 您好 Andreas,感谢您的回答,我在帖子中添加了一些内容。你能看一下吗?非常感谢!
    猜你喜欢
    • 2016-05-26
    • 2010-09-17
    • 2017-05-20
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2018-11-17
    相关资源
    最近更新 更多