Java 如何读取进程getInputstream?
我使用process builder和process(与ffmpeg一起使用),并且我必须将ffmpeg输出重定向到java输入。我写了这段短代码,但是inputstream无论如何都是空的Java 如何读取进程getInputstream?,java,ffmpeg,Java,Ffmpeg,我使用process builder和process(与ffmpeg一起使用),并且我必须将ffmpeg输出重定向到java输入。我写了这段短代码,但是inputstream无论如何都是空的 public class Ffmpegtest { public static void main(String[] args) { String[] cmd = {"ffmpeg ","-i ","output2.mp4 ","-f ","mp4 ", "-"}; InputStream
public class Ffmpegtest {
public static void main(String[] args) {
String[] cmd = {"ffmpeg ","-i ","output2.mp4 ","-f ","mp4 ", "-"};
InputStream stream;
try {
stream = new ProcessBuilder(Arrays.asList(cmd)).start().getInputStream();
System.out.println(stream.available()); // still 0
byte[] kilo = new byte[1024];
int i = stream.read(kilo,0,1024);
while(i != -1){
System.out.println("read "+1024);
i = stream.read(kilo,0,1024);
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
当我跑步时:
ffmpeg -i file -f mp4 -
stdout是空的。然而,斯特尔说:
ffmpeg version N-74516-g99b9f01 Copyright (c) 2000-2015 the FFmpeg developers
built with Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
configuration: --enable-gpl --samples=/Users/ronaldbultje/Movies/fate-suite-ff --enable-libvpx
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 58.100 / 56. 58.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 34.100 / 5. 34.100
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
Input #0, ivf, from 'file.ivf':
Duration: 00:00:00.01, start: 0.002000, bitrate: 178292 kb/s
Stream #0:0: Video: vp9 (Profile 0) (VP90 / 0x30395056), yuv420p(pc, bt470bg/unknown/unknown), 640x480, 1k tbr, 1k tbn, 1k tbc
[mp4 @ 0x7f95aa800000] muxer does not support non seekable output
Output #0, mp4, to 'pipe:':
Metadata:
encoder : Lavf56.40.101
Stream #0:0: Video: mpeg4 ( [0][0][0] / 0x0020), yuv420p, 640x480, q=2-31, 200 kb/s, 1k fps, 1k tbn, 1k tbc
Metadata:
encoder : Lavc56.58.100 mpeg4
Stream mapping:
Stream #0:0 -> #0:0 (vp9 (native) -> mpeg4 (native))
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
这里的关键是“muxer不支持不可查找的输出”。选择支持流式传输的其他输出格式(例如mpegts),或选择文件输出而不是标准输出。作为更一般的java规则,在使用Process时,请始终检查stdout和stderr。运行时:
ffmpeg -i file -f mp4 -
stdout是空的。然而,斯特尔说:
ffmpeg version N-74516-g99b9f01 Copyright (c) 2000-2015 the FFmpeg developers
built with Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
configuration: --enable-gpl --samples=/Users/ronaldbultje/Movies/fate-suite-ff --enable-libvpx
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 58.100 / 56. 58.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 34.100 / 5. 34.100
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
Input #0, ivf, from 'file.ivf':
Duration: 00:00:00.01, start: 0.002000, bitrate: 178292 kb/s
Stream #0:0: Video: vp9 (Profile 0) (VP90 / 0x30395056), yuv420p(pc, bt470bg/unknown/unknown), 640x480, 1k tbr, 1k tbn, 1k tbc
[mp4 @ 0x7f95aa800000] muxer does not support non seekable output
Output #0, mp4, to 'pipe:':
Metadata:
encoder : Lavf56.40.101
Stream #0:0: Video: mpeg4 ( [0][0][0] / 0x0020), yuv420p, 640x480, q=2-31, 200 kb/s, 1k fps, 1k tbn, 1k tbc
Metadata:
encoder : Lavc56.58.100 mpeg4
Stream mapping:
Stream #0:0 -> #0:0 (vp9 (native) -> mpeg4 (native))
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument
这里的关键是“muxer不支持不可查找的输出”。选择支持流式传输的其他输出格式(例如mpegts),或选择文件输出而不是标准输出。作为更一般的java规则,在使用Process时,请始终检查stdout和stderr。与来自java的标准流的其他进程接口总是很棘手的。如果要使用ffmpeg的输出,需要主线程等待另一个进程结束,并且应该始终侦听stdout和stderr。在下面的演示中,使用了两个临时文件(不要忘记清理并检查返回代码):
与来自Java的标准流的其他进程接口总是很棘手的。如果要使用ffmpeg的输出,需要主线程等待另一个进程结束,并且应该始终侦听stdout和stderr。在下面的演示中,使用了两个临时文件(不要忘记清理并检查返回代码):
你有没有试过你的代码。。。用比ffmpeg更简单的东西?意思是:也许您首先要确保您的程序能够从stdin中读取数据;例如,使用echo命令开始测试。另一方面您是否在命令行上验证了您对ffmpeg的选项是否会触发它写入标准输出?没有,因为我必须使用它。这不是我的选择。我没有建议最后做些不同的事情。我要求你确认你的拼图的各个部分相互独立。它不能确保“集成A+B”。。。当你不能100%确定A和B各自做了你认为他们应该做的事情时。这就是我建议你们做的:验证A,然后验证B;然后验证A+B。您是否尝试了您的代码。。。用比ffmpeg更简单的东西?意思是:也许您首先要确保您的程序能够从stdin中读取数据;例如,使用echo命令开始测试。另一方面您是否在命令行上验证了您对ffmpeg的选项是否会触发它写入标准输出?没有,因为我必须使用它。这不是我的选择。我没有建议最后做些不同的事情。我要求你确认你的拼图的各个部分相互独立。它不能确保“集成A+B”。。。当你不能100%确定A和B各自做了你认为他们应该做的事情时。这就是我建议你们做的:验证A,然后验证B;然后验证A+B。好吧,我将mp4更改为mpeg,它将正确的输出打印到cmd。但是在java中,输入流的可用性仍然为零。您仍然需要读取错误流,这将阻止处理进程。好吧,我将mp4更改为mpeg,它将正确的输出打印到cmd。但是在java中,输入流的可用性仍然为零,您仍然需要读取错误流,这将阻止进程的进行。