如何将 RGB 从 YUV420p 转换为 ffmpeg 编码器? [英] How to convert RGB from YUV420p for ffmpeg encoder?

查看:20
本文介绍了如何将 RGB 从 YUV420p 转换为 ffmpeg 编码器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 C++ 代码从位图图像制作 .avi 视频文件.我写了以下代码:

I want to make .avi video file from bitmap images by using c++ code. I wrote the following code:

//Get RGB array data from bmp file
uint8_t* rgb24Data = new uint8_t[3*imgWidth*imgHeight];
hBitmap = (HBITMAP) LoadImage( NULL, _T("myfile.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetDIBits(hdc, hBitmap, 0, imgHeight, rgb24Data , (BITMAPINFO*)&bmi, DIB_RGB_COLORS);

/* Allocate the encoded raw picture. */
AVPicture dst_picture;
avpicture_alloc(&dst_picture, AV_PIX_FMT_YUV420P, imgWidth, imgHeight);

/* Convert rgb24Data to YUV420p and stored into array dst_picture.data */
RGB24toYUV420P(imgWidth, imgHeight, rgb24Data, dst_picture.data); //How to implement this function?

//code for encode frame dst_picture here

我的问题是如何实现RGB24toYUV420P()函数,这个函数会将RGB24数据从数组rgb24Data转换成YUV420p并存入数组dst_picture.data 用于 ffmpeg 编码器?

My problem is how to implement RGB24toYUV420P() function, this function will convert RGB24 data from array rgb24Data to YUV420p and store into array dst_picture.data for ffmpeg encoder?

推荐答案

您可以像这样使用 FFmpeg 中的 libswscale:

You can use libswscale from FFmpeg like this:

#include <libswscale/swscale.h>
SwsContext * ctx = sws_getContext(imgWidth, imgHeight,
                                  AV_PIX_FMT_RGB24, imgWidth, imgHeight,
                                  AV_PIX_FMT_YUV420P, 0, 0, 0, 0);
uint8_t * inData[1] = { rgb24Data }; // RGB24 have one plane
int inLinesize[1] = { 3*imgWidth }; // RGB stride
sws_scale(ctx, inData, inLinesize, 0, imgHeight, dst_picture.data, dst_picture.linesize);

请注意,您应该只创建一次 SwsContext 对象的实例,而不是为每一帧创建一个实例.

Note that you should create an instance of the SwsContext object only once, not for each frame.

这篇关于如何将 RGB 从 YUV420p 转换为 ffmpeg 编码器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆