Edgar, I didn't see anything obvious wrong with what you posted.  If you
can distill it down to a minimal self-contained example that reproduces the
behavior I can take a closer look.

On Sat, Feb 4, 2017 at 1:47 PM, Edgar H <[email protected]> wrote:

> I've been struggling with this problem for quite some time now as it's my
> very first time doing an application related to streaming and I just can't
> figure out why. Here's the problem...
>
> What I'm trying to achieve is to send a command's output as an input for
> the next one, which is basically what the pipe operator does. As I knew
> this couldn't be executed directly with Exec library from Apache Commons I
> started looking for ways to solve this. I've seen quite a few examples of
> similar things to this but none of them covers my situation:
>
> I have two Java applications separated, one is the main application and the
> second one is initialized by the first one. This second applications sends
> to the Standard Output bytes, which FFMPEG should receive.
>
> The code that I have so far is the following one...
>
> public void initStream(String path) {
>     File file = new File(path);
>     for (File s : file.listFiles()) {
>         if (s.getName().equals("ffmpeg.exe")) {
>             try {
>
>                 // Second app, supposedly, writes here.
>                 PipedOutputStream output = new PipedOutputStream();
>
>                 DefaultExecutor executor = new DefaultExecutor();
>                 //DefaultExecutor executorFFMPEG = new DefaultExecutor();
>                 executor.setWorkingDirectory(file);
>                 //executor.setWorkingDirectory(file);
>
>                 CommandLine commandLine = new
> CommandLine(s.getParentFile().getAbsolutePath());
>                 System.out.println("Path: " + commandLine.toString());
>
>                 String executeMe = "java -jar streamer.jar";
>                 commandLine = CommandLine.parse(executeMe);
>
>                 System.out.println("[testing] streamer about to launch.");
>                 executor.setStreamHandler(new PumpStreamHandler(output,
> null));
>                 executor.execute(commandLine, new
> DefaultExecuteResultHandler());
>                 System.out.println("[testing] streamer started.");
>
>                 PipedInputStream input = new PipedInputStream();
>                 output.connect(input);
>
>                 String feedMe = "ffmpeg"; // more attributes here
>                 commandLine = CommandLine.parse(feedMe);
>
>                 System.out.println("[testing] ffmpeg about to launch.");
>                 executor.setStreamHandler(new PumpStreamHandler(null,
> null, input));
>                 executor.execute(commandLine, new
> DefaultExecuteResultHandler());
>                 System.out.println("[testing] ffmpeg started.");
>
>             } catch (IOException e) {
>                 e.printStackTrace();
>             }
>         }
>     }}
>
> And the code for the second application (the zone where I send data to
> the stdout) is the following one.
>
> static OutputStream stdout = System.out;
>
> (more code and other things around here)
>
> try {
>         line = (TargetDataLine) mixer.getLine(info);
>         line.open(format);
>
>         int bytesRead, CHUNK_SIZE = 4096;
>         byte[] data = new byte[line.getBufferSize() / 5];
>
>         line.start();
>
>         while (true) {
>             bytesRead = line.read(data, 0, CHUNK_SIZE);
>             stdout.write(data, 0, bytesRead);
>             stdout.flush();
>         }
>
>     } catch (LineUnavailableException ex) {
>         System.out.println("Line is unavailable.");
>         ex.printStackTrace();
>     }
>
> At the moment, no communication seems to be made between both commands as
> ffmpeg isn't receiving anything.
>
> Hope you guys can tell what I'm missing out, or if I'm incorrectly working
> with the library thinking it works in a way when it works in another one.
>

Reply via email to