【问题标题】:Compressing frames inside an AVI video压缩 AVI 视频中的帧
【发布时间】:2013-06-08 02:15:53
【问题描述】:

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

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

[编辑]

我在 codeproject 上发现了一些非常有趣的 here,来自 2004 年的一篇文章。将帧转换为 mpeg-1 是 100% C# 源代码。遗憾的是,这是 i 帧,而不是 p 帧,因此文件比预期的 mpeg-1 平均文件大小大 3 倍。

[编辑]

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

【问题讨论】:

    标签: c# video compression windows-phone avi


    【解决方案1】:

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

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

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

    我对 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 大致相当,您表示它是不够的。

    我希望我已经为您提供了一些想法和有用的途径来寻求解决方案。

    【讨论】:

    • 感谢这个非常完整和聪明的答案!我已经完善了我的目标,因此不再需要与 WP 兼容。 WP 使用一组有限的兼容编解码器,因此需要双方兼容的项目实现起来非常复杂。我现在的目标只是与 Youtube 之类的网站兼容。我更新了我的问题。我今天将阅读更多内容,以便找到一些途径,使我能够在几天内轻松地用 C# 编写代码,而无需深入了解 C++。
    • 是否可以选择编译 C 代码库并使用本机代码接口工具调用它?有一些众所周知且使用广泛的库,包括 libtheora 和 libvpx 可以完成这项工作。同样,它们的计算成本可能很高。通常,更高级的编解码器和更高效的比特率需要更多的 CPU 时间进行编码。
    • 是的,这就是我失败的地方。我可以找到现有的源代码,但我只是不擅长 C/C++ 调用或编译任何东西。不过,我可以理解算法。反正。我在 Sourceforge 上看到 libtheoraplayer 也已经适应了 Windows Phone,但还没有找到任何编码器项目。我的搜索涵盖 mpeg1,2,4,h264,theora。甚至是微软的 WMV。我已经移植到 WP 的简单 C# mpeg-1 类在同类中完全是独一无二的。我将继续阅读 mpeg-1 中的预测,cmlab.csie.ntu.edu.tw/cml/dsp/training/coding/mpeg1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2014-08-04
    • 2013-05-23
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多