当我将BufferedImages写入临时文件夹然后调用ffmpeg将其转换为视频时。有没有办法将图像从java中直接发送到ffmpeg而不是先写出来?我假设如果可能的话,这将是一种更快的方法吗?
这就是我目前正在从目录中精确读取的内容。
ProcessBuilder processBuilder = new ProcessBuilder(
"ffmpeg",
"-y",
"-r", framerate,
"-f", "image2",
"-i", imageFramesDir,
"-itsoffset", offset.toString(),
"-i", audioFile,
"-c:v", "libx264",
"-c:a", "aac",
"-pix_fmt", "yuv420p",
"-crf", "23",
"-r", "24",
"-vf", "scale=720x406,setdar=16:9",
outputFile);
processBuilder.redirectErrorStream(false);
Process process = processBuilder.start();
答案 0 :(得分:0)
当您向ffmpeg输入图像时,您有多个选项,例如图像顺序,带有水母图案,通过滚边或使用concat demuxer。由于图像存储在内存中,因此您无需将图像写入本地驱动器。它会降低应用程序的速度并严重影响性能。您可以使用管道将图像提供给ffmpeg。检查this链接以查看有关ffmpeg的管道数据的更多信息。
此外,您可以使用concat demuxer从多个图像创建视频。 Concat demuxer允许您使用单个文本文件使用多个位置图像。您只需将图像路径保存到文本文件中并运行以下命令。
ffmpeg -f concat -safe 0 -i text.txt -vcodec mpeg4 -f mpegts test.mp4
根据您的要求,管道将是更加可靠的选择。但这两种方法都可以应用于您的问题。