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

时间:2015-02-27 10:58:42

标签: c++ arrays video colors memory-efficient

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

1 个答案:

答案 0 :(得分:2)

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

视频压缩是一个非常复杂的主题,但或多或​​少,它的工作原理如下:某些“关键帧”使用与静态照片压缩(如JPEG)相似或相同的相当标准的压缩技术进行压缩。通过将帧与前一帧进行比较并查找更改(例如移动块)来压缩关键帧之后的帧。不时地,使用新的关键帧。

您不必担心这一点,因为您不打算编写自己的视频编码器/解码器(编解码器)。有标准的。

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

你可能不会自己这样做 - 这很难。您可能需要使用框架,例如OpenCV。这些框架内置了大量的标准过滤器和工具,可能你想要做的就是在某个地方实现。

OpenCV框架可以返回Mat对象中的各个帧,然后您可以访问像素。请参阅此帖子Get Pixels from Mat

OpenCV

教程页面:Open CV Tutorial