我正在用Java编写视频应用程序,执行ffmpeg并将其输出捕获到标准输出.我决定使用Apache Commons-Exec而不是Java Runtime,因为它似乎更好.但是,我很难捕获所有输出.
我认为使用管道是可行的方法,因为它是进程间通信的标准方式.但是,我的设置使用PipedInputStream和PipedOutputStream错误.它似乎工作,但只适用于流的前1042个字节,奇怪的是恰好是值的PipedInputStream.PIPE_SIZE.
我对使用管道并不感兴趣,但我想避免使用磁盘I/O(如果可能),因为数据的速度和数量(512x384分辨率的1m 20s视频产生690 M个管道数据).
关于处理来自管道的大量数据的最佳解决方案的想法?我的两个课程的代码如下.(是的,sleep很糟糕.对此的想法? wait()和notifyAll()?)
WriteFrames.javapublic class WriteFrames {
public static void main(String[] args) {
String commandName = "ffmpeg";
CommandLine commandLine = new CommandLine(commandName);
File filename = new File(args[0]);
String[] options = new String[] {
"-i",
filename.getAbsolutePath(),
"-an",
"-f",
"yuv4mpegpipe",
"-"};
for (String s : options) {
commandLine.addArgument(s);
}
PipedOutputStream output = new PipedOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler(output, System.err); …Run Code Online (Sandbox Code Playgroud)