4

我最近写了一个BMP图像的图像处理C程序,我必须读取像素值并处理它们,很简单我按照BMP头的内容,我可以得到BMP图像的大部分信息。

现在的挑战是处理视频(逐帧),我该怎么做?我如何能够读取视频剪辑中连续图像帧流的标题?或者,是不是像,例如,mpeg 格式也将具有通用标头,在阅读时我可以获得有关整个视频的信息,并且在标头之后,所有数据都只是像素。

我希望我能传达。

有没有人有处理视频的经验?

任何书籍或教程链接都会非常有帮助。

4

3 回答 3

4

像 MPEG 一样,视频流由许多帧组成,这些帧取决于(显然)其持续时间和帧速率。要读取像素,您必须从所谓的帧内帧开始,该帧不依赖于流中的前一帧。任何连续的帧都是在时间上依赖于其前一帧的帧,因此要获得其像素,您必须将流从 Intra 解码为所需的帧。
请注意,通常会周期性地插入帧内帧,以便为解码器提供与流同步的方法。这在可能发生错误的情况下非常有用。
你想做的不是一件容易的事。您必须使用 MPEG 解码器,然后在显示之前修改帧,如果您想进行后期处理,如过滤器或其他。
我建议你学习视频编码,你可以找到很多关于这方面的材料,从标准的 MPEG 开始。

于 2010-04-27T20:16:38.247 回答
2

我建议研究FFMpeg。它有一个命令行实用程序,可以从电影中抓取帧并将它们转储到像 JPG 这样的图像中。然后,您可以修改现有阅读器以处理 JPG 文件(只需使用 libjpeg 之类的东西将 JPG 解码为原始像素缓冲区)。

或者,您可以使用 FFMpeg API(C、Python 等),并以编程方式进行帧捕获,并在视频中移动时查看像素。视频格式很复杂,因此除非您想开始了解所有不同的编解码器,否则您可能需要获取一个库来为您解码到原始像素缓冲区。

于 2010-04-27T20:33:08.027 回答
1

MPEG 1/2/4 视频比位图更难处理,因为它们是经过压缩的。使用位图数据,您可以将实际颜色值直接存储到文件中。在 MPEG 或 JPEG 中,颜色信息在写入文件之前会经过多次转换。这些包括

  • RGB -> YUV 420P(子采样色度)
  • 离散余弦变换
  • 加权量化
  • 之字形排序
  • 差分编码
  • 可变长度编码(Huffman-like)

所有这些都意味着没有简单的方法可以从文件中解析出像素数据。您要么必须研究标准的每一分钟细节并编写自己的解码器,要么使用像 ffmpeg 这样的视频解码库来为您完成工作。ffmpeg 可以将您的视频转换为静止图像(请参阅最近的问题的答案)。此外,您可以直接连接到 ffmpeg 库(libavformat 和 libavcodec)。有关好的教程,请参阅此问题的答案。

于 2010-04-27T20:47:08.383 回答