通过Runtime.exec()将输入流传递给ffmpeg

时间:2015-06-22 17:12:28

标签: java ffmpeg

我想使用ffmpeg来读取流式传输到某种Java InputStream的视频,而不必将其写入文件,然后使用ffmpeg来完成处理文件,希望通过其标准输入。

我希望使用ProcessBuilderProcess个对象执行此操作。这可能吗,如果可以,怎么做?如果这些对象无法实现,是否可以使用ffmpeg包装器进行此操作?

2 个答案:

答案 0 :(得分:1)

只需使用fifo文件,Java和ffmpeg都将它们视为普通文件。您可以使用mkfifo或安装脚本调用Runtime.exec()来创建fifo文件。

答案 1 :(得分:0)

下面的示例代码,它创建一个ffmpeg进程并将其输出抓取到InputStream中。 Trick是让ffmpeg将输出返回给stdin并抓住进程的inputStream。 请注意,这不适用于所有容器格式,例如 mp4 mov ,这些容器格式是可搜索容器,与mpeg-ts不同(由于指向确切位置的指针)在这些容器中存在的视频文件中,如mp4文件的moov原子中的stco子原子,在ffmpeg操作期间无法确定)

Process process = new ProcessBuilder(
            "/usr/local/Cellar/ffmpeg/2.6.3/bin/ffmpeg", // ffmpeg location
            "-re",
            "-i", "/Users/Downloads/videoTests/1.mp4", // input file
            "-vcodec", "libx264",
            "-s", "640x320",
            //"-r", "24",
            "-acodec", "libmp3lame",
            "-f", "mpegts",
            "-" // this tells ffmpeg to outout the result to stdin
    ).start();
    new Thread() {
        public void run() {
            InputStream inputStream = process.getInputStream();
            //do whatever has to be done with inputStream
        }
    }.start();
}