我正在Raspberry pi 3 Jessie上用Java做一个小程序,我正在尝试使用omxplayer从java程序内部播放声音。
我有以下代码:
ProcessBuilder p = new ProcessBuilder("omxplayer", "/path/to/wav");
p.redirectErrorStream(true);
Process pr = p.start();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(pr.getInputStream()));
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
try {
String line = "";
while((line = bufferedReader.readLine()) != null) {
System.out.println("Reading " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
程序将正确播放声音,但在到达 wav 的末尾然后打印所有声音之前不会输出任何内容。 但是,当我直接在终端中启动相同的命令时,我可以看到在 wav 期间显示的文本。
例如,当我在运行 omxplayer 的终端中按"+"或"-"时,它会更改音量并打印"当前音量:blabla mB",但是当我通过ProcessBuilder
发送"+"或"-"时,我可以听到我的 wav 变化的声音,但仍然没有输出。
这很奇怪,因为我已经将ProcessBuilder
用于许多其他用途,并且从未遇到过这样的问题。
你认为问题出在omxplayer的实现上吗?还是我在这里做错了什么?
编辑:
我尝试在没有缓冲阅读器的情况下读取流:
InputStream inputStream = pr.getInputStream();
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
try {
int read;
while((read = inputStream.read()) >= 0) {
System.out.println("Reading " + (char)read);
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
如果 OMX播放器没有发送任何行返回,但问题仍然存在。
我遇到了完全相同的问题,可以使用参数-s(统计数据)修复它。在这种情况下,播放器会不断放置状态信息以及所有开始信息。