存储视频数据的最有效方式

Most efficient way to store video data

为了完成对某些 .avi 文件的一些特定编辑,我想创建一个能够加载、编辑和保存这些 .avi 文件的应用程序(在 C++ 中)。但是,最有效的方法是什么?最初考虑时,一个简单的 3D 数组包含每个帧的 2D 像素数组似乎是最简单的解决方案;但是它的大小将是巨大的。我的意思是,让我们假设一个像素只需要一种颜色。一种颜色表示 3 个字节(1char r、1char b、1char g)。如果我现在有一个 1920x1080 的视频格式,这意味着只有一帧需要 2 兆字节!如果使用颜色指针,此数据可能会或可能不会更小,因此已经使用的颜色不会占用更多大小——我真的不知道,因为我对 C++ 和整个低级的东西还很陌生。 (作为比较:我用 Xvid 编解码器录制的一个 AVI 文件长 40 秒,30fps,只有 2MB。) 那么,您实际上如何有效地存储视频数据(甚至不是音频,只是视频)(同时仍然能够轻松地对其执行每帧更改)?

如您所知,未压缩的视频非常庞大,以这种方式存储整个视频是不切实际的。

视频压缩是一个极其复杂的主题,但或多或​​少的工作原理如下:某些 "key-frames" 使用与静态照片压缩(如 JPEG)类似或相同的相当标准的压缩技术进行压缩。通过将帧与前一帧进行比较并寻找变化(例如移动块)来压缩关键帧之后的帧。时不时地使用一个新的关键帧。

您真的不必太担心,因为您不会编写自己的视频 coder/decoder(编解码器)。有标准的。

您的程序将逐帧解码压缩视频,并在您处理这些视频时在内存中保留一定数量的帧,然后在完成后重新编码。在未压缩的形式中,您将可以访问各个像素并可以按需要对其进行处理。

您可能不会自己做 - 这非常困难。您可能需要使用一个框架,例如 OpenCV。这些框架内置了大量的标准过滤器和工具,可能你想做的事情已经在某处实现了。

OpenCV 框架可以 return Mat 对象中的单个帧,然后您可以访问像素。看到这个postGet Pixels from Mat

OpenCV

教程页面:Open CV Tutorial