0

如果标题很混乱,我很抱歉,但我想知道是否有可能获得一个应用程序的标准输出,该应用程序通过管道传输到 java 中的另一个应用程序。

这是命令行。

sox -d -t wav - | lame - test.mp3

如果这是在 bash 中执行的,这就是输出。

Input File     : '/dev/dsp' (ossdsp)
Channels       : 2
Sample Rate    : 48000
Precision      : 16-bit
Sample Encoding: 16-bit Signed Integer PCM

In:0.00% 00:00:25.00 [00:00:00.00] Out:1.20M [     -|=-    ]        Clip:0

最后一行由 sox 更新,直到用户发送 SIGINT。

问题是,在 java 中,来自该进程的 InputStream 不会产生任何数据。但是,如果我省略了 sox 的管道sox -d -t wav test.wav,那么 InputStream 会获取数据。我的问题是,控制台出了什么问题?我怎样才能访问它。

4

1 回答 1

1

当 bash 开始执行时sox -d -t wav - | lame - test.mp3,由于管道字符 bash 将分叉两个进程来执行每个命令,然后将 stdout 从第一个进程与 stdin 连接到第二个进程。Bash 不会对任一进程的 stderr 执行任何特定操作,因此您从 sox ( Input File ...) 看到的屏幕输出不是管道操作的一部分。

根据我从您的问题中了解到的情况,您有一个 java 程序可以启动这两个 sox 和 lame 进程。有关您如何执行此操作的更多详细信息会很好。但无论如何,要获得您展示的屏幕输出示例,您必须从 sox 进程中读取 stderr 。

于 2010-02-28T14:01:51.127 回答