压缩AVI视频中的帧

时间:2013-06-07 02:26:35

标签: c# video compression windows-phone avi

我已经构建了一个Windows Phone类,将一些WriteableBitmap转换为AVI全帧(未压缩)。视频真的很大。是否存在一个简单的编解码器实现,比如只是压缩图像的编解码器,或者正在制作下一个/上一个XOR然后在jpeg中压缩它的东西?

Windows Phone不允许任何不安全的代码,并且大多数DLL无法包装到C#WP库中。所以这就是我从头开始编码的原因。请注意,我从头开始编码比学习C ++现有源代码更有效率(我不是C ++编码器),因此我所搜索的是关于压缩AVI格式的信息,无需编写100000行即可实现。我使用AVI是因为规格很简单。

[编辑]

我从2004年的一篇文章中发现了一些关于codeproject的非常有趣的here。将帧转换为mpeg-1是100%C#源。可悲的是,这是i帧,而不是p帧,所以文件比预期的mpeg-1平均文件大小大3倍。

[编辑]

为了描述更多我的项目,我要做的是对捕获的电影应用一些效果。这部电影将上传到Youtube或其他一些网站。因此,用户期望在电话上使用的精确分辨率,至少25帧/秒,良好的质量和短的上传时间。所以我不能停止使用Mpeg-1 I-Frames。我需要研究mpeg-1中的预测。

1 个答案:

答案 0 :(得分:1)

我认为这是your previous question的延续/重新发布(但有更多细节)。正如我在该帖子的评论中所提到的,那里有一整套视频编解码器。这种扩散的一个原因是许多人喜欢重新发明轮子。但是,一个更为突出的原因是视频有很多不同的用例。

你似乎要求很多,但你还没有提出很多变数:

  • 您需要一个纯粹在Windows Phone设备上运行的视频编码器,这必然是一台相当低功耗的机器;你需要它实时运行吗?即,您是否希望在发送未压缩帧(几毫秒)后几乎立即压缩视频帧?或者你可以让设备考虑压缩一段时间吗?
  • 视频帧有多大?你在WP设备上进行屏幕捕获,即计算机生成的数据吗?或者你正在从相机中读取原始帧并希望压缩它们吗?
  • 从上一点开始,什么类型的视频数据?使用某类编解码器,计算机生成的数据看起来会更好。照片质量的图像(来自相机)意味着不同的编解码器系列。
  • 你的目标是什么?如果你有1秒的视频,它应该占用的最大字节数是什么(或者你希望如此)?
  • 谁是视频的最终消费者?在上一篇文章中,您表示您要上传到YouTube。如果是这样,那么你很幸运,因为YouTube(由FFmpeg支持)几乎处理宇宙中的每个编解码器,所以你会有很多选择。

我对Windows Phone编程了解不多。但是,任何WP设备在技术上都具有硬件视频编码功能。我已经做了一些粗略的谷歌搜索,以确定您是否在应用程序编程级别获得任何访问权限,但我找不到任何可能的证据(以及this SO answer states该功能不存在)。

我希望给你留下深刻的印象,写一个视频编码器是一个很多的工作(看看我的用户名;我知道从哪里说话)。通常,它们需要相当大的CPU功率(因此,电池功率,尤其是在纯软件中实现时)。但是,您已经对使用标准zlib的编解码器做了一些猜测。实际上,有一些基于直接zlib的视频编解码器,即MSZH和ZLIB,统称为Lossless Codec Libraries。该wiki页面有一个基本的比特流描述(披露:我操作该wiki网站)。我确信WP库包含对zlib编码的访问权限,因此这可能是一个起点,YouTube应该能够消化生成的文件。

还有一个视频编解码器,在您猜测时(Dosbox Capture Codec)结合了XOR和zlib,但它可能不适合您的应用。

图书馆是否提供对标准JPEG的访问(即,它能编码JPEG文件)吗?另一种选择(取决于视频类型)是填充在AVI文件中的静止JPEG图像的连续帧。这称为Motion JPEG或MJPEG。但是,它在比特率上大致相当于仅限内部MPEG-1,你表示它是不合适的。

我希望我已经给你一些想法和有用的途径来寻求解决方案。