【问题标题】:How to write YUV 420 video frames from RGB data using OpenCV or other image processing library?如何使用 OpenCV 或其他图像处理库从 RGB 数据写入 YUV 420 视频帧?
【发布时间】:2012-03-27 01:29:41
【问题描述】:

我有一个从 glReadPixels() 生成的 rgb 数据数组。
请注意,RGB 数据是像素打包的 (r1,g1,b1,r2,g2,b2,...)。

如何使用 OpenCV 或其他 C++ 库快速编写 YUV 视频帧,以便将它们流式传输到 FFMPEG?将 RGB 像素转换为 YUV 像素不是问题,因为网上有很多转换公式。然而,编写 YUV 框架是我的主要问题。从最近几天开始,我一直在尝试编写 YUV 视频帧,但没有成功。

这是我关于编写 YUV 框架的另一个问题和我遇到的问题之一:Issue with writing YUV image frame in C/C++ 我不知道我目前将 YUV 帧写入文件的方法有什么问题。

所以现在我可能想使用现有的库(如果有的话),它接受 RGB 数据,并将它们转换为 YUV 并将 YUV 帧直接写入文件或管道。当然,如果我能修复我现有的程序来编写 YUV 框架会更好,但是你知道,每个软件开发项目都有一个截止日期,所以时间也是我和我的项目团队成员的优先事项。

【问题讨论】:

  • 您在 FFMPEG 中尝试过 swscale 吗?用 swscale 转换像素格式和缩放图像只需要 3 行代码。
  • 为什么必须将 YUV 数据流式传输到 FFmpeg?为什么不只提供 RGB 数据?
  • 编写 YUV 帧不需要库。您说您可以将 RGB 数据转换为 Y、U 和 V。只需将该数据以相同的顺序写入文件中即可。您可以通过采用替代值对 U 和 V 进行二次采样。然后你只需要一个好的 YUV 播放器来查看那个文件。我已经做过很多次了,很简单。
  • @TheJuice:所以我有一个 OpenGL 应用程序正在运行,我想捕获动画显示(使用 glReadPixels),然后我想将此数据通过管道传输到 FFMPEG 并使用 Red5 服务器将其流式传输到Web 浏览器作为 RTMP 实时流媒体。我从kylecordes.com/2007/pipe-ffmpeg 和其他相关网站了解到,FFMPEG 可以通过管道接收输入数据,但数据必须以 YUV 视频帧格式编码。你能指导我找到解决这个问题的正确方法吗?这是我目前的方法:stackoverflow.com/questions/9858388/…
  • 如果此问题已成功回答,请考虑通过单击旁边的复选框来选择官方答案。如果没有,请考虑添加您自己的答案。

标签: c++ image-processing opencv yuv


【解决方案1】:

FFmpeg 会愉快地接收 RGB 数据。你可以通过运行查看 FFmpeg 支持哪些像素格式:

ffmpeg -pix_fmts

第一列中带有I 的任何条目都可以用作输入。

由于您没有指定像素位深度,我将假设它是 8 位并使用 rgb8 像素格式。因此,要让 FFmpeg 从 stdin 读取 rgb8 数据,您将使用以下命令(我是 cating 数据,但您将通过管道提供):

cat data.rgb | ffmpeg -f rawvideo -pix_fmt rgb8 -s WIDTHxHEIGHT -i pipe:0 output.mov

由于它是一种没有框架的原始像素格式,因此您需要将 WIDTH 和 HEIGHT 替换为图像尺寸的适当值,以便 FFmpeg 知道如何对数据进行框架。

我已将输出指定为 MOV 文件,但您需要相应地配置 FFmpeg/Red5 输出。

【讨论】:

    【解决方案2】:

    如您所知,OpenCV 不直接支持 YUV 格式,因此您必须找到一种方法来进行 RGB YUV 转换。

    This is a very interesting post,因为它显示了如何在磁盘上加载和创建 YUV 帧,同时将数据存储为 IplImage

    【讨论】:

      【解决方案3】:

      ffmpeg 将使用 YUV 编写一个 AVI 文件,但正如 karl 所说,openCV 中没有直接支持它。

      或者(可能更简单)您可以将原始 UYVY 值写入文件,然后使用 ffmpeg 将其转换为您想要的任何格式的 AVI/MP4。也可以直接写入管道并直接从您的应用程序调用 ffmpeg,避免使用临时 yuv 文件

      例如。以 30fps 将高清 yuv422 流转换为 h264 MP4 文件

      ffmpeg -pix_fmt yuyv422 -s 1920x1080 -i input.yuv -vcodec libx264 -x264opts -r 30 output.mp4

      【讨论】:

      • 所以我有一个 OpenGL 应用程序正在运行,我想捕获动画显示(使用 glReadPixels),然后我想将此数据通过管道传输到 FFMPEG 并使用 Red5 将其作为 RTMP 流式传输到 Web 浏览器直播。我从 kylecordes.com/2007/pipe-ffmpeg 和其他相关网站了解到,FFMPEG 可以通过管道接收 RTMP 流数据,但数据必须以 YUV 视频帧格式编码。你能指导我采取正确的方法吗?这是我目前的方法stackoverflow.com/questions/9858388,我参考了wiki.multimedia.cx/index.php?title=YUV4MPEG2
      • @all_by_grace - 如果您正在阅读 RGB 屏幕,直接写入这些值不是更简单吗? ffmpeg 和 openCV 都可以从 RGB 像素格式创建视频。 ps 在这两种情况下你都无法处理非常高的帧速率,除非你有一个非常花哨的突袭系统
      猜你喜欢
      • 2017-04-23
      • 2013-09-28
      • 1970-01-01
      • 2015-08-28
      • 2015-11-06
      • 2020-06-27
      • 2012-03-08
      • 1970-01-01
      • 2019-01-11
      相关资源
      最近更新 更多