我正在寻找一种将java应用程序中的一系列图像(JPEG)流式传输到FFMpeg标准管道中的方法。FFMpeg应该处理这些图像并创建一个视频文件作为输出。
FFMpeg作为java应用程序的子进程执行,使用以下命令“ffmpeg.exe-i管道: 0out.avi”
当我在控制台中运行“ffmpeg-i input.jpg out.avi”命令时,我得到了预期的“out.avi”文件
但是,当我在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版本N-59664-g94cf4f8版权所有(c)2000-2014 FFmpeg开发人员构建于7 2014 22:07:021月,使用gcc 4.8.2(GCC)
配置:--enable-gpl--enable-version3--disable-w32线程--enable-avisynth--enable-bzlib--enable-fontconfig--enable-frei0r--enable-gnutls--enable-conv--enable-libass--enable-libblay-libcaca--enable-libfreetype--enable-libgsm--enable-libbilbc--enable-libmp3lame--enable-libopencore-amrnb--enable-libopenjpeg--enable-libopus--enable-Libschroedinger--enable-libsoxr--enable--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
管道::处理输入时发现无效数据
有什么办法让它工作吗?
非常感谢您抽出时间。
我认为你不应该重定向输入。默认情况下,ProcessBuilder构建一个从管道读取输入的流程。
首先,确保您在代码中使用的确切命令可以从命令行运行。对于管道,似乎必须手动指定格式和编解码器:
ffmpeg -f image2pipe -codec mjpeg -i pipe:0 out.avi < input.jpg
Java程序本身看起来不错。
Process 结构体代表了一个正在运行的子进程,并公开了stdin(标准输入),stdout(标准输出) 和 stderr(标准错误) 句柄,通过管道和底层的进程交互。(原文:The Process struct represents a running child process, and exposes the stdin, stdout and stderr handles for int
计算机如何执行进程呢?这是计算机运行的核心问题。即使已经编写好程序,但程序是死的。只有活的进程才能产出。我们已经从Linux进程基础中了解了进程。现在我们看一下从程序到进程的漫漫征程。 一段程序 下面是一个简单的C程序,假设该程序已经编译好,生成可执行文件vamei.exe。 #include <stdio.h> int glob=0;
问题内容: 我希望能够从现有的Java应用程序启动Java服务器进程,并监视stdoutput和stderror并将该输出重定向到文件。是使用“ Runtime.exec”并像对待其他任何OS进程一样对待应用程序的最佳方法,还是有一些更适合新JVM的方法。 这是在Java 1.5上 问题答案: 而不是,您可能应该使用,尽管我不知道其他情况是否更适合您的情况(尤其是运行Java进程)。
我想运行node。js作为子流程,并向其提供输入。使用C,下面是我的一些示例代码。 我遇到的问题是,尽管子进程的stdout仍然指向终端,但在向子进程stdin输入打印的“helloworld”行后,我什么也看不到。即使我对管道进行了fflush()操作,我也看不到任何输出。但是,如果关闭管道的输入,则“Hello World”将显示在终端上。 子流程似乎只是缓冲-为什么?我希望最终将子流程std
我有一个客户端和一个服务器。客户端在特定端口上绑定一个套接字,服务器向客户端发回一个新端口,客户端应在新端口号上绑定一个新套接字。 从主服务器线程开始,我启动一个线程,一旦服务器准备好并正在监听新端口,就向客户端发送消息,以便客户端可以尝试连接到新端口。来自子线程的管道没有将消息发送到客户端。所以客户端和服务器都冻结了,看起来像是死锁,但我不确定。客户端:系统中的这行代码。出来println(“来
问题内容: 在最新版本(v0.31.0)中,电子附带了静态链接的FFMpeg库(不是命令行工具,请参见#2588) 我知道很多用于ffmpeg的nodejs模块,但是它们看起来都像是命令行工具的api,那么理想情况下我该如何访问与电子捆绑在一起的ffmpeg库并编码流? 问题答案: 当前这是不可能的,因为没有针对Node.js的不错的库。意思是,只有这样抽象了CLI。但是,可以将其编译和链接为节点