java调用ffmpeg读取mov视频信息卡住


发表于 2018-08-31 10:54


最近在用java调用ffmpeg读取视频信息的时候发现了一个奇怪的问题,windows下读取mov格式的视频信息会卡住,命令行如下:

ffprobe -v error -print_format json -show_streams f:/xungou.mov

ffmpeg版本信息如下: QQ截图20180831105304.png

java代码如下:

String[] cmdArray = new String[] { "ffprobe", "-v", "error", "-print_format", "json", "-show_streams","f:/xungou.mov" };
ProcessBuilder builder = new ProcessBuilder(cmdArray);
builder.start().waitFor();
//read output stream

同样的命令读取mp4文件就没有任何的问题。

后来发现把 -print_format 删除之后读取就正常了,但是这样就取不到期望的格式了,所以不予考虑,辗转一番之后发现了一个inheritIO方法可以正常工作:

ProcessBuilder builder = new ProcessBuilder(cmdArray).inheritIO();

这样的话可以正常的输出想要的结果,但是会直接输出到控制台,通过 pb.getInputStream()获取到的是NullInputStream对象,这样就导致我无法获取到返回结果,关于为什么会得到NullInputStream,官方文档解释的很清楚:

Sets this process builder’s standard output destination. Subprocesses subsequently started by this object’s start() method send their standard output to this destination. If the destination is Redirect.PIPE (the initial value), then the standard output of a subprocess can be read using the input stream returned by Process.getInputStream(). If the destination is set to any other value, then Process.getInputStream() will return a null input stream.

如果pb.redirectOutput方法目的地不是Redirect.PIPE,那么始终返回NullInputStream对象,而inheritIO方法等效于:

pb.redirectInput(Redirect.INHERIT)
   .redirectOutput(Redirect.INHERIT)
   .redirectError(Redirect.INHERIT)

虽然没有解决这个问题,但提供了一个方向,通过调用redirectOutput方法,可以将结果输出到文件中去,比如:

ProcessBuilder builder = new ProcessBuilder(cmdArray).redirectOutput(new File("out.txt"));

测试之后发现可以向out.txt文件输入正常的结果,然后通过读取文件内容就可以获取想要的内容了。但是这样比较繁琐,所以最后还是换了个命令:

ffprobe -v error -select_streams v:0 -show_entries stream=width,height,duration -of default=noprint_wrappers=1:nokey=1 f:/xungou.mov

只输出了视频的尺寸和时长。

虽然最终也没有弄出个所以然,但好歹还是解决了这个问题,就记录下吧。


搜索