Java:如何从一组图像创建电影?
Posted
技术标签:
【中文标题】Java:如何从一组图像创建电影?【英文标题】:Java: How do I create a movie from an array of images? 【发布时间】:2012-02-10 00:31:09 【问题描述】:我基本上有一个字节矩阵。每行(意思是 byte[])代表一个图像。如何从中创建电影(任何格式 - avi、mpeg 等),并将其保存为文件? 每个图像可以是以下之一:
int JPEG Encoded formats.
int NV16 YCbCr format, used for video.
int NV21 YCrCb format used for images, which uses the NV21 encoding format.
int RGB_565 RGB format used for pictures encoded as RGB_565.
int YUY2 YCbCr format used for images, which uses YUYV (YUY2) encoding format.
int YV12 android YUV format: This format is exposed to software decoders and applications.
我可以选择任何我喜欢的格式,只要我能创作电影。
public void createMovie(byte[][] images)
// and ideas on what to write here?
我不需要实际的实现,只要让我知道想法和我需要什么外部库(如果我需要的话)。
在创建电影(添加一些文本)之前,我还需要编辑一些图像(字节流)。我该怎么做?
解决方案必须是“仅限 Java”!没有外部程序,没有外部命令(但我可以使用外部 jar)。
谢谢!
【问题讨论】:
+1,回答一个令人惊奇的问题。希望我能回答这个问题,但我的杯子完全是空的。希望有人会。问候 从另一个问题37963625/answer-38024735 您也可以使用ffmpeg
来实现您的目标,我可以保证该答案中的示例可以从一组图像生成视频。
【参考方案1】:
解决方案似乎是使用Mencoder(或者至少,这似乎是一个半流行的选择)。
这是一个专门针对 Mencoder 中的 images-to-movies 功能的链接。
至于在将文本编码为视频的一部分之前将文本渲染到帧上,您可以使用 Java2D 的图像处理库预先在图像上简单地绘制文本例如:
通过ImageIO library's .read method 将图像加载到BufferedImage 对象中 使用Graphics2D's .drawString method 渲染文本这是实现它的一种方法,this FAQ 应该可以帮助您开始使用 Java2D、字体呈现等,并提供指向更多资源的指针。
ImageIO 库还允许您读取/写入多种图像格式,有效地允许您从 .jpg -> BufferedImage -> .png 或任何您需要的方式对图像进行转码,如果您希望在转换过程中临时存储图像文件,和/或在为转换项目导入图像时将所有图像转换为单一格式等。
根据您想要支持的输出格式的数量,您可能会执行类似的操作
public void createMovie(BufferedImage[] frames, String destinationFormat)
...其中“destinationFormat”类似于“m4v”、“mpeg2”、“h.264”、“gif”等。
【讨论】:
感谢您的回答!你的解决方案听起来很棒!但是 Mencoder 似乎是一个外部程序。我有没有提到我只需要 Java 中的这个? :) 我没有.... 哦,我没有意识到这一点。如果您不想通过系统调用使用外部库/程序,那么恐怕我没有任何替代解决方案。 至少我关于如何在图像上写文字的问题得到了解答。谢谢你!【参考方案2】:您可以尝试使用此gif encoder 制作 gif。
【讨论】:
谢谢,但我需要一个 avi 或 mpeg,压缩或不压缩。【参考方案3】:您听说过JMF(Java 媒体框架)吗,从示例中您可以找到这个示例:Generating a Movie File from a List of (JPEG) Images
【讨论】:
这将是一个理想的解决方案,但我找不到任何描述如何使用 JMF 编写视频文件的教程。该线程没有我可以阅读的答案... 抱歉之前的链接,我没有看到它没有解决。此示例来自 JMF 文档,应该会更好。【参考方案4】:我编写了一个 MJPEG 读取器和写入器,用于在 Java 小程序中播放视频。 MJPEG 不是最先进的视频格式,但很容易操作。该代码是我的计算机视觉库BoofCV 的一部分,但您可以出于自己的目的删除这一类。
-
下载此文件:CreateMJpeg.java
查看主函数。它在 jpeg 图像中读取的位置放置您的 byte[] 数据,但您需要先将其转换为 jpeg 的数据。
您可以使用标准 java 库将其转换为 jpeg
运行修改后的代码并欣赏您的电影
抱歉,它的格式不是对用户更友好,但至少您不需要像其他一些解决方案那样乱用 JNI。
【讨论】:
我试过了,但我的播放器无法打开输出文件,即使我将它重命名为“avi”。 哪个玩家?在我的 Ubuntu 系统上,它在 mplayer 中播放得很好。 这对我不起作用。如何让它在 Windows 上运行?以上是关于Java:如何从一组图像创建电影?的主要内容,如果未能解决你的问题,请参考以下文章