使用 sws_scale 把buffer1 中的yuv422 转换成 yuv420p 的 AVFrame 原始数据 只有data 没有linesize
时间: 2023-12-03 07:44:19 浏览: 119
可以使用如下代码将YUV422转换成YUV420P:
```
int src_w = 1920; // 原始图像宽度
int src_h = 1080; // 原始图像高度
int dst_w = 1920; // 目标图像宽度
int dst_h = 1080; // 目标图像高度
// 输入图像
uint8_t *src_data[3];
src_data[0] = buffer1;
src_data[1] = buffer1 + src_w * src_h;
src_data[2] = buffer1 + src_w * src_h * 3 / 2;
// 输出图像
AVFrame *dst_frame = av_frame_alloc();
dst_frame->format = AV_PIX_FMT_YUV420P;
dst_frame->width = dst_w;
dst_frame->height = dst_h;
av_image_alloc(dst_frame->data, dst_frame->linesize, dst_w, dst_h, AV_PIX_FMT_YUV420P, 1);
// 初始化缩放器
struct SwsContext *sws_ctx = sws_getContext(src_w, src_h, AV_PIX_FMT_YUV422P,
dst_w, dst_h, AV_PIX_FMT_YUV420P,
SWS_BILINEAR, NULL, NULL, NULL);
// 图像缩放
sws_scale(sws_ctx, src_data, NULL, 0, src_h, dst_frame->data, dst_frame->linesize);
// 释放缩放器
sws_freeContext(sws_ctx);
```
其中,`buffer1`是原始数据,`src_w`和`src_h`是原始图像的宽度和高度,`dst_w`和`dst_h`是目标图像的宽度和高度。`src_data`是原始数据的指针数组,`dst_frame`是输出的AVFrame结构体。`sws_getContext`函数用于初始化缩放器,`sws_scale`函数用于执行缩放操作。最后,记得释放缩放器。
阅读全文