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 (статистика). В этом случае игрок непрерывно размещает информацию о состоянии, а также всю начальную информацию.

Другие вопросы по тегам