我有一个从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框架会好得多,但是你知道,每个软件开发项目都有一个截止日期,所以时间也是我和我的项目团队成员的优先考虑。 / p>
答案 0 :(得分: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输出。
答案 1 :(得分:0)
OpenCV不直接支持YUV格式,因此您可以找到一种方法来做 RGB< - > YUV 转换。
This is a very interesting post因为它显示如何在磁盘上加载和创建YUV帧,同时将数据存储为IplImage
。
答案 2 :(得分:0)
ffmpeg将用YUV写一个AVI文件,但卡尔说在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