我想使用ffmpeg来读取流式传输到某种Java InputStream
的视频,而不必将其写入文件,然后使用ffmpeg来完成处理文件,希望通过其标准输入。
我希望使用ProcessBuilder
或Process
个对象执行此操作。这可能吗,如果可以,怎么做?如果这些对象无法实现,是否可以使用ffmpeg包装器进行此操作?
答案 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();
}