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

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

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

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

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

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


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

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

它可以制作来自bmps,pngs等的AVI。

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

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

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

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

两件事情:

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

我想到了几种解决方案:

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

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

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

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

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

以下是该文档的链接: 从多个输入图像文件(JPEG,PNG,TGA等)进行编码

关于透明度:我不认为有一个支持透明的video编解码器,所以你在这里运气不好……

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

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