如何使用OpenCV或其他图像处理库从RGB数据中编写YUV 420视频帧?

4
我有一个由glReadPixels()生成的RGB数据数组。
请注意,RGB数据是像素打包的(r1,g1,b1,r2,g2,b2,...)。
我该如何快速使用OpenCV或其他C ++库编写YUV视频帧,以便可以将它们流式传输到FFMPEG?将RGB像素转换为YUV像素不是问题,因为在线上有许多转换公式可用。然而,对我来说,编写YUV帧是主要问题。我已经尝试了最后几天编写YUV视频帧,并且并没有成功完成。
这是我的另一个关于编写YUV帧和我遇到的问题的问题:在C/C++中编写YUV图像帧时出现问题 我不知道我当前在将YUV帧写入文件方面的方法有什么问题。

现在我想使用已有的库(如果有的话),接受RGB数据,将它们转换为YUV并直接将YUV帧写入文件或管道。当然,如果我能修复现有程序以写入YUV帧,那就更好了,但是你知道,在每个软件开发项目中都有截止日期,所以时间对我和我的项目团队成员来说也很重要。


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

2

FFmpeg可以轻松地接收RGB数据。你可以通过运行以下命令来查看FFmpeg支持哪些像素格式:

ffmpeg -pix_fmts

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

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

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

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

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


0

OpenCV不直接支持YUV格式,所以你需要找到一种方法来进行RGB<->YUV转换。

这篇文章非常有趣,因为它展示了如何在磁盘上加载和创建YUV帧,同时将数据存储为IplImage


0

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

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

例如,将HD yuv422流转换为30fps的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视频帧格式进行编码。你能指导我正确的方法吗?这是我目前的方法https://dev59.com/OmHVa4cB1Zd3GeqPru4V,我是从http://wiki.multimedia.cx/index.php?title=YUV4MPEG2参考的。 - all_by_grace
@all_by_grace - 如果你正在阅读 RGB 屏幕,直接编写这些值不是更简单吗? ffmpeg 和 openCV 都可以从 RGB 像素格式创建视频。 另外,无论哪种情况下,如果您没有非常昂贵的 RAID 系统,都无法处理非常高的帧速率。 - Martin Beckett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接