gpt4 book ai didi

ffmpeg - 如何将 YUV420p 的 RGB 转换为 ffmpeg 编码器?

转载 作者:行者123 更新时间:2023-12-03 20:04:44 30 4
gpt4 key购买 nike

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

//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 编码器?

最佳答案

您可以使用 libswscale来自 FFmpeg像这样:

#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 的实例。对象只有一次,而不是每一帧。

关于ffmpeg - 如何将 YUV420p 的 RGB 转换为 ffmpeg 编码器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16667687/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com