ProcessBuilder в Java на Raspberry Pi 3 не отображает поток ошибок / ввода для omxplayer
Я делаю небольшую программу на Java на Raspberry pi 3 Jessie и пытаюсь использовать 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, он изменяет громкость и печатает "Текущий объем: блабла мБ", но когда я отправляю через ProcessBuilder
"+" или "-", я слышу звук изменений в моем wav, но все еще не выводит.
Это странно, потому что я использовал ProcessBuilder
для многих других применений, и никогда не сталкивался с проблемой как таковой.
Как вы думаете, проблема в реализации omxplayer? Или я что-то здесь не так делаю?
РЕДАКТИРОВАТЬ:
Я попытался прочитать поток без BufferedReader как таковой:
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();
}
}
});
в случае, если omxplayer не отправил ни одной строки, но проблема остается.
1 ответ
У меня была точно такая же проблема, и я мог ее исправить с помощью параметра -s (статистика). В этом случае игрок непрерывно размещает информацию о состоянии, а также всю начальную информацию.