我正在尝试创建一个java程序,它自动将输入文件夹中的wtv文件转换为输出文件夹中的mpg文件。扭曲是我定期运行它,因此它充当同步器。
以下代码适用于将.wtv转换为.dvr-ms,这是ffmpeg所必需的,因为它无法直接转换.wtv文件。
Process p = Runtime.getRuntime().exec("C:\\Windows\\ehome\\WTVConverter C:\\Users\\Andrew\\Desktop\\test\\input\\input.wtv C:\\Users\\Andrew\\Desktop\\test\\output\\input.dvr-ms");
p.waitFor();
WTVConverter从java应用程序运行没有问题。 ffmpeg是一个不同的故事。一旦上面一行运行,我就运行这个......
Process p = Runtime.getRuntime().exec("ffmpeg\\bin\\ffmpeg -y -i \"C:\\Users\\Andrew\\Desktop\\test\\output\\input.dvr-ms'" -vcodec copy -acodec copy -f dvd \"C:\Users\Andrew\Desktop\test\output\input.mpg\"");
p.waitFor();
突然,出现问题......应用程序ffmpeg显示在任务管理器中,但它的cpu使用率为0,并且没有生成mpeg文件。但是,如果我强制关闭java应用程序,它会突然开始工作!咦?
命令行应用程序在执行之前等待其调用应用程序退出的原因是什么?我没有令人难以置信的命令行精明,所以我真的不知道如何诊断这个问题。
答案 0 :(得分:1)
呸,这总是发生。我发了一个问题,然后我就自己解决了。事实证明,ffmpeg希望你在加载每一帧之前读入它的文本输出。如果调用程序不这样做,它只是等待。如果没有调用程序,我认为它只是无处输出。我所做的是像往常一样运行程序,但也从过程的输入流中读取文本,如此......
Process p = Runtime.getRuntime.exec(".....");
final Scanner in = new Scanner(p.getInputStream());
new Thread()
{
@Override
public void run()
{
System.out.println(in.nextLine());
}
}.start();
经验教训,我想。