Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何读取进程getInputstream?_Java_Ffmpeg - Fatal编程技术网

Java 如何读取进程getInputstream?

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

我使用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 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中,输入流的可用性仍然为零,您仍然需要读取错误流,这将阻止进程的进行。