管道从java应用程序到ffmpeg子进程的图像系列

时间:2014-01-10 10:04:39

标签: java ffmpeg pipe bufferedimage

我正在寻找一种将java应用程序中的一系列图像(jpeg)流式传输到FFMpeg STDIN管道的方法。 FFMpeg应处理这些图像并创建视频文件作为输出。

使用以下命令“ffmpeg.exe -i pipe:0 out.avi”将FFMpeg作为java应用程序的子进程执行

当我在控制台中运行“ffmpeg -i input.jpg out.avi”命令时,我按预期获得“out.avi”文件

但是当我在我的java应用程序中使用以下测试器代码时,我收到了一个错误。

Java应用程序中的代码:

File ffmpeg_output_msg = new File("ffmpeg_output_msg.txt");
ProcessBuilder pb = new ProcessBuilder(
        "ffmpeg.exe","-i","pipe:0","out.avi");
pb.redirectErrorStream(true);
pb.redirectOutput(ffmpeg_output_msg);
pb.redirectInput(ProcessBuilder.Redirect.PIPE);
Process p = pb.start();
OutputStream ffmpegInput = p.getOutputStream();

byte[] image;
File file = new File("input.jpg");
image = new byte[(int)file.length()];

FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(image);

ImageInputStream iis = ImageIO.createImageInputStream(
        new ByteArrayInputStream(image));
BufferedImage img = ImageIO.read(iis);

ImageIO.write(img, "JPEG", ffmpegInput);

FFMpeg输出:

  

ffmpeg版本N-59664-g94cf4f8版权所有(c)2000-2014 FFmpeg开发人员于2014年1月7日22:07:02建立了gcc 4.8.2(GCC)
  配置: - enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable -libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore- amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable- libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib

libavutil      52. 62.100 / 52. 62.100
libavcodec     55. 47.100 / 55. 47.100
libavformat    55. 22.102 / 55. 22.102
libavdevice    55.  5.102 / 55.  5.102
libavfilter     4.  0.103 /  4.  0.103
libswscale      2.  5.101 /  2.  5.101
libswresample   0. 17.104 /  0. 17.104
libpostproc    52.  3.100 / 52.  3.100
     

pipe ::处理输入时找到的数据无效

任何想法如何使它工作?

非常感谢你的时间。

2 个答案:

答案 0 :(得分:4)

首先确保您在代码中使用的确切命令可以从命令行运行。看来,对于管道,必须手动指定格式和编解码器:

ffmpeg -f image2pipe -codec mjpeg -i pipe:0 out.avi < input.jpg

Java程序本身看起来很好。

答案 1 :(得分:1)

我认为你不应该重定向输入。默认情况下,ProcessBuilder构建一个从管道读取输入的进程。