为什么Java缓冲stdin / stdout在此代码中失败?

时间:2016-02-27 15:21:37

标签: java io video-processing

我正在尝试在ubuntu上运行的Java应用程序中以编程方式更改gplay的音量级别。视频播放得很好;我看到了gplay的菜单;我得到了我的第一个" Play"提示,我写了一个" v" for" [v] Volume"但我从未看到音量提示"设定音量。"我得到了我期望从BufferedReader获得的所有数据,但BufferedWriter似乎没有工作。当我从控制台运行gplay时,一切都按预期工作。谁能看到我做错了什么?

P.S。 gplay是一个基于Gstreamer架构的命令行播放器。 Gstreamer是一个功能强大的多功能框架,用于创建流媒体应用程序。来自飞思卡尔半导体。

谢谢。

List<String> command = new ArrayList<String>();
command.add("gplay");
command.add("demoVideo.mp4");

ProcessBuilder builder = new ProcessBuilder(command);
builder.directory(new File("/home/ubuntu"));
builder.redirectErrorStream(true);

Process playVideoProcess = builder.start();

// get the input stream connected to the normal output of the subprocess
InputStream is = playVideoProcess.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

// get the output stream connected to the normal input of the subprocess
OutputStream os = playVideoProcess.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);

while (true)
{
    line = br.readLine();
    if (line != null)
    {
        if (debug) logger.log(Level.INFO, "--> " + line);

        if (line.contains("[Playing  ][Vol=01]"))
        {
            bw.write("v");
            bw.newLine();
            bw.flush();
        }
        else if (line.contains("Set volume"))
        {
            bw.write("10");
            bw.newLine();
            bw.flush();
        }
        else if (line.contains("[Playing  ][Vol=10]"))
        {
            logger.log(Level.INFO, "* Done. CLOSING ALL STREAMS *");
            bw.close();
            osw.close();
            os.close();

            br.close();
            isr.close();
            is.close();
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

gplay字面输出“[正在播放] [Vol = 01]”?因为line.contains只查看文字字符串,并且不适用于例如regex或其他高级字符串匹配系统。 (因为我假设您使用[]使其可选)