I am looking for a way to stream series of images (jpegs) from java application into FFMpeg STDIN pipe. FFMpeg should process these images and create a video file as an output.
FFMpeg is executed as sub process of java application with the following command "ffmpeg.exe -i pipe:0 out.avi"
When i run "ffmpeg -i input.jpg out.avi" command in the console, i get the "out.avi" file as expected
But when i use the following tester code in my java application, i got an error.
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 version N-59664-g94cf4f8 Copyright (c) 2000-2014 the FFmpeg developers built on Jan 7 2014 22:07:02 with gcc 4.8.2 (GCC)
configuration: --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-zliblibavutil 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:: Invalid data found when processing input
Any ideas how to make it work?
Thank you very much for your time.
First make sure the exact command you use in the code works from the command line. It appears that for pipes the format and codec must be specified manually:
ffmpeg -f image2pipe -codec mjpeg -i pipe:0 out.avi < input.jpg
The Java program itself looks fine.
I don't think you should be redirecting the input. By default the ProcessBuilder builds a process that reads input from a pipe.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With