c语言实现yuv420p转rgb24
时间: 2023-09-04 14:06:49 浏览: 277
可以使用FFmpeg库来实现yuv420p转rgb24,以下是一段示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <libavutil/imgutils.h>
#include <libavutil/parseutils.h>
#include <libavutil/pixdesc.h>
// 输入YUV数据的宽度和高度,以及每个像素的字节数
#define SRC_WIDTH 640
#define SRC_HEIGHT 480
#define SRC_PIXEL_BYTES 1
// 输出RGB数据的宽度和高度,以及每个像素的字节数
#define DST_WIDTH 640
#define DST_HEIGHT 480
#define DST_PIXEL_BYTES 3
int main(int argc, char **argv)
{
AVFrame *frame = av_frame_alloc();
// 初始化输入YUV数据的AVFrame
frame->width = SRC_WIDTH;
frame->height = SRC_HEIGHT;
frame->format = AV_PIX_FMT_YUV420P;
av_frame_get_buffer(frame, 16);
// 将输入数据拷贝到AVFrame中
uint8_t *src_data[4] = {NULL};
src_data[0] = malloc(SRC_WIDTH * SRC_HEIGHT * SRC_PIXEL_BYTES);
src_data[1] = src_data[0] + SRC_WIDTH * SRC_HEIGHT;
src_data[2] = src_data[1] + SRC_WIDTH * SRC_HEIGHT / 4;
memset(src_data[0], 0, SRC_WIDTH * SRC_HEIGHT * SRC_PIXEL_BYTES);
memset(src_data[1], 128, SRC_WIDTH * SRC_HEIGHT / 4);
memset(src_data[2], 128, SRC_WIDTH * SRC_HEIGHT / 4);
int src_linesize[4] = {SRC_WIDTH * SRC_PIXEL_BYTES, SRC_WIDTH * SRC_PIXEL_BYTES / 2, SRC_WIDTH * SRC_PIXEL_BYTES / 2};
av_image_fill_arrays(frame->data, frame->linesize, src_data, AV_PIX_FMT_YUV420P, SRC_WIDTH, SRC_HEIGHT, 16);
// 初始化输出RGB数据的AVFrame
AVFrame *rgb_frame = av_frame_alloc();
rgb_frame->width = DST_WIDTH;
rgb_frame->height = DST_HEIGHT;
rgb_frame->format = AV_PIX_FMT_RGB24;
av_frame_get_buffer(rgb_frame, 16);
// 将AVFrame中的YUV数据转换成RGB数据
struct SwsContext *sws_ctx = sws_getContext(SRC_WIDTH, SRC_HEIGHT, AV_PIX_FMT_YUV420P,
DST_WIDTH, DST_HEIGHT, AV_PIX_FMT_RGB24,
SWS_BILINEAR, NULL, NULL, NULL);
sws_scale(sws_ctx, (const uint8_t *const *)frame->data, frame->linesize, 0, SRC_HEIGHT, rgb_frame->data, rgb_frame->linesize);
sws_freeContext(sws_ctx);
// 打印输出RGB数据的前三个像素
printf("%02X %02X %02X\n", rgb_frame->data[0][0], rgb_frame->data[0][1], rgb_frame->data[0][2]);
printf("%02X %02X %02X\n", rgb_frame->data[0][3], rgb_frame->data[0][4], rgb_frame->data[0][5]);
printf("%02X %02X %02X\n", rgb_frame->data[0][6], rgb_frame->data[0][7], rgb_frame->data[0][8]);
av_frame_free(&frame);
av_frame_free(&rgb_frame);
free(src_data[0]);
return 0;
}
```
阅读全文