使用Windows AVIFile功能的Delphi 6应用程序提高压缩率?

时间:2012-05-12 14:49:03

标签: delphi winapi video-encoding avi

我有一个Delphi 6应用程序,可以从来自机器人的传入视频和音频流制作电影。 PC将视频流作为一系列JPEG帧接收,将音频作为PCM音频数据块接收。我正在使用Windows AVIFile函数(AVIStreamCreate等)来创建电影。对于视频压缩器的选择,我使用AVISaveOptions()函数,让用户从他们系统上可用的压缩器中选择一个。例如:Microsoft Video 1,Radius的Cinepak Code等。请注意其他几个可用的,例如Microsoft H.263或H.261因AVIERR_BADFORMAT错误而失败,因此我无法使用它们进行测试。使用GSM 6.10压缩器​​压缩音频。

问题是我似乎无法接近压缩率,我可以使用像Adobe Premiere这样的工具进行比较。注意,我知道Premiere使用与我不同的整体流程进行压缩,使用不同的文件格式,如MPEG或Quicktime等。但是如果可以的话,我希望得到相当的压缩率。

无论我从AVISaveOptions()中选择哪种压缩器,无论压缩机的可用压缩质量设置有多低(例如,微软视频1的时间质量比和压缩质量),都需要几分钟。视频总是最终创建一个大约14MB的AVI文件。为了比较,我可以使用Adobe Premiere创建的文件大小不到1 MB,并且看起来与 visual 质量相同(换句话说,对我的目的而言足够好。我不关心实际质量损失在这里。)。

如果我检查使用Windows AVI API的文件输出,我发现我用压缩器更改的设置都不会影响帧速率。它始终与输入帧速率相同。现在,如果有必要,我可以在输入端丢帧,但由于它与音频同步会有点混乱,如果可以,我想避免这样做。

但更重要的是数据速率。无论压缩机设置有多低,我都无法达到大约2.3 kbps的速度。我使用Premiere制作的视频,以及我玩过的其他视频具有健康的文件大小与持续时间比率,大约都是1.2 kbps。

总体而言,我的AVI文件的文件大小与我使用Premiere或其他人创建的文件大小之间的差异已经发送给我,压缩得很好 10到1 。因此,我的压缩率比其他视频文件差10倍,而其他文件的视频质量也没有任何不愉快的差异。

我可以做些什么来获得可比的压缩比?

更新:David Heffernan的回复包含一个对我有用的快速解决方案。我正在强调它,因为它也包含重要的许可警告。对于像我这样的人来说,想要尽可能方便用户使用XVid编解码器,请阅读下面的文章。它包含有关如何重新使用用户的压缩器选择以及他们选择的压缩配置选项的说明,以备将来再次打扰用户:

http://msdn.microsoft.com/en-us/magazine/hh580739.aspx

好奇的是,从我以前的输出AVI文件大小到使用XVid编解码器创建的文件的大小变化是12.231 MB到632 KB ,视频质量非常合理。

1 个答案:

答案 0 :(得分:2)

真正简单的答案是安装XVID编码器。 Windows提供的所有编解码器都不适合您的目的。 XVID既高品质又免费。

关于分配和许可影响,XVID FAQ可以这样说:

  

我可以将Xvid与我的专有程序一起分发吗?

     

如果您的程序在运行时调用Xvid功能,则它是派生的工作,因此,GPL的条款适用于整个工作,包括您的程序。所以不,你不能将Xvid与你的专有程序一起分发。如果您想分发,您还必须在GPL下发布您的程序。这也需要例如提供完整的应用程序源代码。有关更多信息,请参阅GPL许可证文本。

     

我们根本没有链接到Xvid,只是在运行时通过VfW界面调用 - 我们可以使用我们的专有软件进行分发吗?

     

没有。链接到Xvid的方式或者您认为链接的内容和不链接的内容无关紧要。 GPL根本不关注“链接”一词,而是要求根据GPL条款将合并/衍生作品整体发布。基本上,任何两个(或更多)部件在分配以便组合使用时构成组合工作。因此,如果您的程序在运行时调用Xvid功能,它将组成派生工作 - 无论您在技术上如何实现对Xvid的调用。如果您不想在GPL下发布您的程序,请不要将其与Xvid一起发布。

这对您来说意味着,如果您的程序也是根据GPL许可的话,您只能在程序中分发XVID。但是,向用户建议他们自己获得XVID是完全没问题的。