【问题标题】:Using ffplay or ffmpeg how can I get a pixel's rgb value in a frame使用 ffplay 或 ffmpeg 如何在帧中获取像素的 rgb 值
【发布时间】:2014-05-20 13:54:05
【问题描述】:

我想在使用 ffmpeg 解码的每一帧中提取像素的 rgb 值。我查看了ffplay源代码

get_video_frame
video_refresh
queue_picture

我尝试了以上三种方法来挂钩框架,但我不明白如何获取像素的 rgb 值。有人可以指点一下吗

【问题讨论】:

  • 视频不对 RGB 进行操作,它使用 YCbCr(通常是 4:2:0 二次采样,如果你不明白,请使用维基百科)然后只需执行 ffmpeg -i file.264 out.yuv 即可获得重建的缓冲区。在那里,您将所有像素值直接作为 uint8。
  • 我希望将像素值提供给外部进程,这样我就无法将它们转储到文件中并从外部读取它们。所以这个想法是当我播放视频时,我想打开一个套接字并发送像素值
  • 如我所说。 ffmpeg 提供 YCbCr 4:2:0 数据。如果您需要 RGB,则需要使用 Rec.601 或 Rec.709 中定义的变换矩阵将数据转换为 RGB。函数avcodec_decode_video2 返回一个 YCbCr 解码缓冲区。 ffmpeg 可能也可以进行转换,但我从不使用 RGB 数据,所以我不知道如何
  • 不一定正确。 avcodec_decode_video2 以编解码器对其进行编码的任何格式为您提供像素数据。 YCbCr 4:2:0 可能是最常见的格式,但它可能是 RGB、YUV444 等。你需要检查 AVCodec 中的 pix_fmt。从那里您可以从 AVFrame 结构中提取像素数据。

标签: c++ video ffmpeg decode


【解决方案1】:
http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=15&t=805

这就是来源,这是我使用的转换来源,它按预期工作。希望这可以帮助某人

ColorRGB GetRGBPixel(const AVFrame& frame, int x, int y)
{
    // Y component
    const unsigned char y = frame.data[0][frame.linesize[0]*y + x];

    // U, V components 
    x /= 2;
    y /= 2;
    const unsigned char u = frame.data[1][frame.linesize[1]*y + x];
    const unsigned char v = frame.data[2][frame.linesize[2]*y + x];

    // RGB conversion
    const unsigned char r = y + 1.402*(v-128);
    const unsigned char g = y - 0.344*(u-128) - 0.714*(v-128);
    const unsigned char b = y + 1.772*(u-128);

    return ColorRGB(r, g, b);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多