如何用5000个PNG文件创建一个电影?

时间:2009-07-18 09:39:07

标签: c# animation

嗯,简单的情况。我创建了大约5000帧作为PNG文件,我想在.NET应用程序中显示为动画。每张图片的大小为1920x1080,PNG文件使用Alpha通道进行(部分)透明。这会使事情变得复杂,因为我宁愿保持透明。 (但如果这是不可能的,我只会在每个PNG上添加背景图片。)

由于图像数量庞大,我需要大量内存。那么,运行Vista 64位的1 TB硬盘和12 GB四核Intel Xeon系统正在解决这些内存需求。但除非创建一个工具来支持64位,否则它可能会在加载5000个图像中的800个之后窒息。所以我需要一个可以做到这一点的工具。

电影格式并不重要。只要图像质量保持很高,压缩也不会。 (而且有一个原因,我使用了这么大的分辨率!)无损压缩是首选。我的系统足够快,以后再播放电影,所以我不担心它的速度。但是,图像质量是这里最重要的因素。

到目前为止,我已经提出了两个选择: 1)我找到了一些可以处理这么多数据的免费工具。 (免费或非常便宜。) 2)我自己写这样一个工具......

选项1在这里有点不合适。此外,作为一名软件工程师,我的手只是抽搐自己写的!在C#中,最好没有第三方库。所以我的问题: - 自己从哪里开始写这个?


(如果你想知道,这部电影是一部动画片,一名年轻女子走过一些城市的街道,传递几个提到产品特征的标志。电影结束时她走向一个更大的标志,上面显示了产品本身的名称。它是一个长而连续的场景,没有休息。创造真正的乐趣!大约10 GB的图像......)

5 个答案:

答案 0 :(得分:10)

如果你在Windows上,你也可以查看virtualdub。 http://www.virtualdub.org/

它可以通过bmps,pngs等制作AVI。

答案 1 :(得分:9)

FFMPEG能够从一系列图像文件创建电影文件,这个指向其手册的链接显示了一个例子:

http://ffmpeg.org/ffmpeg-doc.html#SEC5

至于创建没有第三方库的programaticcaly的电影文件......这将会更加困难。很多电影格式非常复杂,如果没有现有的库就可以创建一个非常痛苦(除非我误解了你的问题而你实际上并没有询问创建实际的编码器)。

如果我没有误解你的问题,那么做一个基于YUV的电影编解码器的简单实现可能是可行的。 HuffYUV是我所知道的,可能不会太具挑战性。

答案 2 :(得分:6)

两件事:

  • 要自己写一个合适的视频编码器。不是由一个长镜头。因此,您可以选择重复使用现有编码器,或者根本不使用编码器。
  • 没有视频格式可以处理透明度问题。您可以为所有图像提供背景,或者您将无法使用现有的视频格式。

有几种解决方案可供考虑:

您不关心尺寸,但关心质量。我要问的第一件事是:你真的真的不在乎尺寸吗?大多数视频格式(特别是H.264)将以极低的文件大小(10倍)为您提供卓越的品质。你几乎无法区分它们。是的,您的内容是高清,但电视或蓝光的高清内容也是压缩的(使用H.264或VC-1),对其他人来说已经足够了。因此,我会认真考虑这个选项,因为它使其余部分变得更加容易。

如果您愿意,您可以随时使用无损视频格式,例如HuffYUV。这至少会为您提供一些压缩,同时将视频数据的大小减半(或更多)。

正如我所说,通过使用编码视频格式,您会失去透明度。如果你想保持透明度,而你仍然不关心文件大小,为什么不保留PNG并在应用程序中将它们显示为非常快速的幻灯片?如果您唯一的问题是一次将所有PNG加载到内存中的内存要求......请不要这样做。读取前面几帧(固定数量或内存允许),一旦显示一帧,将其从内存中删除并提前读取新帧。这样你就可以保持完美的质量和恒定的内存要求。唯一的问题是你的磁盘和处理器需要能够跟上每秒读取30个PNG的速率(或者你的帧速率)。

此外,如果5000个单独的图像文件太难以处理,您可以将它们全部包装成一些自定义文件格式。 ZIP文件会以简单的便携式格式呈现,或者您可以自己动手。

答案 3 :(得分:2)

你可以用mencoder做你想做的事:

以下是该文档的链接: Encoding from multiple input image files (JPEG, PNG, TGA, etc.)

关于透明度:我认为没有支持透明的视频编解码器,所以你在这里运气不好......

答案 4 :(得分:1)

或者 - 如果你在Windows上 - 只需使用Movie Maker。

它需要相当大的RAM和处理能力,但比VirtualDub更直观,并允许您添加一些简单的效果和标题。