java - 从java程序中的FFMpeg中的图像到视频

标签 java image video ffmpeg

目前我正在将 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();

最佳答案

当您将图像输入到 ffmpeg 时,您有多个选项,例如顺序图像、使用 glob 模式、通过管道或使用 concat demuxer。由于图像存储在内存中,因此您不必将图像写入本地驱动器。它会降低应用程序的速度并严重影响性能。您可以使用管道将图像馈送到 ffmpeg。查看this链接以查看有关 ffmpeg 的管道数据的更多信息。

您还可以使用 concat demuxer 从多个图像创建视频。 Concat demuxer 允许您使用单个文本文件使用多个位置图像。您只需将图像路径保存到文本文件中并运行以下命令。

ffmpeg -f concat -safe 0 -i text.txt -vcodec mpeg4  -f mpegts test.mp4

管道将是满足您要求的更可靠的选择。但是这两种方法都可以应用于您的问题。

关于java - 从java程序中的FFMpeg中的图像到视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47757682/

相关文章:

java - 卡夫卡消费者民意调查(超时: 0) but actually fetch the records back

java - 为什么Hibernate在一对一关系的情况下要放inner join?

java - 在 while 循环中将对象添加到列表

html - 电子邮件中的图像未显示

android - 将视频文件存储在内部或 SD 卡存储器上并受到保护?

java - 简化 ifPresentOrElse 链

c - 镜像位图图像

html - 如果图像宽度 = 250 CSS

android - YouTube 视频不在 WebView 中播放

java - 如何在android中的视频上添加应用程序 Logo