【问题标题】:Encode 256 Palletized bitmaps to h264 using libav使用 libav 将 256 个 Palletized 位图编码为 h264
【发布时间】:2014-03-10 08:05:49
【问题描述】:

我将 32 bpp 位图转换为具有 256 色调色板的 8bpp,此图像我想使用 h264 编码并通过套接字发送。在另一端解码帧并将其显示在我的 UI 上。

来自编码器,侧面:

  1. 捕获 32 bpp 图像。
  2. 使用 256 色调色板将图像量化为 8bpp。
  3. Sws_将图像从 PIX_FMT_GRAY8 缩放到 YUV420P。
  4. 使用 h264 编码并通过套接字发送。

来自解码器,侧面。

  1. 接收图像。
  2. 解码图像。
  3. Sws_scale 从 YUV420P 到 PIX_FMT_GRAY8
  4. 并将其与调色板信息一起显示在 UI 上(从编码器通过套接字发送)。

当执行上述步骤时,我得到一个完全扭曲的图像。当我不使用调色板时,我得到一个黑白图像。

我不清楚如何使用 h264 对 8bpp 256 调色板位图进行编码并相应地对其进行解码。请帮我解决这个问题。

我在 Windows 平台上使用 C++。

提前致谢, 保罗。

【问题讨论】:

    标签: ffmpeg libavcodec


    【解决方案1】:

    h.264 不是(默认情况下)无损编解码器。所以你不会得到你逐像素输入的确切颜色。在 YUV 中,Y 平面是亮度(黑色和白色),UV 平面是色度。所以你的紫外线平面在这里是空的。 Y 平面以有损方式压缩。所以你可能有一个看起来像 0=black 1=red 2=green ... 255=white 的托盘。然后你输入一个 2 像素。在压缩过程中,为了消除图像的复杂性以减小文件大小,2 可能会变为 1。在黑白图像中,您不会注意到差异。但是当你应用你的托盘时,你的绿色像素就变成了红色。

    您要么需要使用无损编解码器,要么将 256 色图像编码为 YUV 彩色图像。然后通过查找最接近的颜色或每个解码的像素,将颜色重新量化回所需的调色板。

    【讨论】:

    • 嗨,szatmary,谢谢你的启发,你能指导我使用一些 C 或 C++ 库吗,它可以将 256 色图像转换为 YUV 图像,这对这个领域来说是个新手。
    • Libswscale 会做到的。
    • 我怎样才能重新量化图像,有没有这个库?
    • 我不知道,也许吧。您只需要在调色板中找到“最接近”的颜色。 3d 欧几里得距离可能不是一个好方法。也许是PSNR?我会打开另一个问题来询问这个问题,以便从比我更了解色彩理论的人那里得到答案。
    猜你喜欢
    • 2015-05-13
    • 2023-03-10
    • 2016-11-10
    • 2013-01-27
    • 2015-12-30
    • 2011-02-24
    • 2011-11-10
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多