Java:如何从图像数组创建电影?

35

我基本上有一个字节矩阵。每行(即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包)。

谢谢!


4
+1,这是一个很棒的问题。我希望我能回答这个问题,但我的知识在这方面完全空白。希望有人能够回答。祝好! - nIcE cOw
从另一个问题37963625/answer-38024735中,您也可以使用ffmpeg来实现您的目标,我可以证明该答案中的示例是有效的,可以从图像数组生成视频。 - iggy12345
4个回答

8
解决方案似乎是使用Mencoder(或者至少这似乎是一个半受欢迎的选择)。
以下链接专门介绍了Mencoder中将图像转换为电影的功能。
至于在将文本渲染到帧上并将其编码为视频的过程中,您可以使用Java2D的图像处理库事先在图像上绘制文本。例如:

这是一种方法,此FAQ 可以让您在Java2D、字体渲染等方面入门,并提供指向更多资源的指针。

ImageIO库还允许您读写多种图像格式,有效地使您能够转码图像,例如从 .jpg -> BufferedImage -> .png,或者任何您需要做的方式。如果您想在转换过程中暂时存储图像文件并/或将所有图像转换为单个格式以进行转换项目等,您可以这样做。

根据您要支持的输出格式数量,您可能会做类似以下的操作:

public void createMovie(BufferedImage[] frames, String destinationFormat)

...其中“destinationFormat”类似于“m4v”,“mpeg2”,“h.264”,“gif”等。


1
谢谢你的回答!你的解决方案听起来很棒!但是Mencoder似乎是一个外部程序。我有没有提到我只需要Java实现? :) 我没有... - user361676
哦,我没有意识到这一点。如果你不想通过系统调用使用外部库/程序,那么恐怕我没有其他替代解决方案。 - jefflunt
至少我的关于如何在图像上写文本的问题得到了回答。谢谢! - user361676

5

这将是一个理想的解决方案,但我找不到任何描述如何使用JMF编写视频文件的教程。那个线程没有我能阅读的答案... - user361676
抱歉之前的链接有问题,我没看到它还未解决。这个示例来自JMF文档,应该更好。 - webpat

2

谢谢,但我需要一个压缩或未压缩的AVI或MPEG文件。 - user361676

1

我为Java小程序编写了一个MJPEG读取器和写入器,用于播放视频。MJPEG不是最先进的视频格式,但它非常容易操作。这段代码是我的计算机视觉库BoofCV的一部分,但你可以只提取这个类来满足自己的需求。

  1. 下载这个文件:CreateMJpeg.java
  2. 查看主函数。在读取jpeg图像的位置上,放入你的byte[]数据,但你需要先将其转换为jpeg格式。
    • 你可以使用标准的Java库将其转换为jpeg格式
  3. 运行修改后的代码,享受你的电影吧

很抱歉它不是以更用户友好的格式呈现,但至少你不需要像其他解决方案那样去搞JNI。


我尝试了,但是即使我将输出文件重命名为“avi”,我的播放器仍然无法打开它。 - user361676
哪个播放器?在我的Ubuntu系统中,它在mplayer中播放得很好。 - lessthanoptimal
这对我不起作用。我该如何在Windows上使其工作? - Teacher of Things

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接