【问题标题】:How to read pixel values of a video?如何读取视频的像素值?
【发布时间】:2011-02-13 01:26:18
【问题描述】:

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

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

我希望我能传达。

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

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

【问题讨论】:

    标签: image-processing video-processing


    【解决方案1】:

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

    【讨论】:

    • 感谢 Maurizio 的建议。我只需要再澄清一点,我猜 mpeg 是一种像 jpeg 这样的压缩格式,是否有任何视频格式本质上是未压缩的(在 BMP 图像的行上)?我只想避免使用视频解码器。另外,请建议我对以下陈述是否正确/错误 - RAW 视频格式不需要解码器。
    • 我从未使用过 RAW 解码器,但我认为您的说法是正确的。很抱歉,我无法向您建议任何这些。
    • 嗨,Maurizio,我几天前发布了一个新问题,请看一下。它的标题是:网络摄像头视频流处理。它只有 9 次观看,还没有答案。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢 SB。请您花点时间回答我向 Jason 和 Maurizio 提出的几个问题?
    • 您不会找到很多未压缩的视频。我什至不知道视频的 RAW 格式是如何布局的。对于图像,它几乎就像 BMP,但它可以在不同的色彩空间中。您可能需要进行色彩空间转换。我真的认为您应该使用 ffmpeg 命令行工具将视频帧吐出到 bmp 然后使用您的程序,或者使用 ffmpeg 库。杰森基本上说了我在回答中建议的事情。
    【解决方案3】:

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

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

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

    【讨论】:

    • 我不同意你的看法。这取决于您必须执行的处理类型。如果您进行简单的模糊处理,例如,您可以在要显示的帧的副本中执行此操作,而无需更改解码器。请注意,更改解码器可能会对解码过程产生严重影响:解码器必须是标准的。
    • 我只是在指出,如果不使用复杂的解码软件,您将无法轻松编写程序来从视频文件中获取像素数据。确实,一旦帧被解码,处理与位图的处理完全相同,因为此时您已将其转换为原始 RGB 图像数据。
    • 感谢 Maurizio(再次)和 Jason 的建议。 Jason,我想知道您对以下问题的看法 - 我猜 mpeg 是一种像 jpeg 这样的压缩格式,是否有任何视频格式本质上是未压缩的(在 BMP 图像的行上)?我只想避免使用视频解码器。另外,请告诉我以下陈述是否正确/错误 - RAW 视频格式不需要解码器。
    • 是的,有未压缩的格式。我不确定它们有多标准(我不知道它们是否会与各种各样的玩家一起工作)。我知道您可以通过在命令行中使用 -vcodec rawvideo 来使用 ffmpeg 创建未压缩的视频文件。它可以让您将该视频放入它具有的任何容器格式,例如 AVI,或者您可以在没有容器的情况下直接输出。
    • 未压缩的视频不是很受欢迎,因为它需要的空间和压缩后仍然可以获得的质量。我刚刚尝试将 12 MB 的 mpeg-4 示例剪辑转换为未压缩的版本,结果为 684 MB。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多