ffmpeg处理YUV422和YUV420P相互转换

article/2025/9/29 7:22:53
YUV422空间大小计算
YUV422封包width*height+width/2*height*2
YUYV Y分量width*height
YUYV U分量width/2*height
YUYV V分量width/2*height

 YUV420空间大小计算

YUV420封包width*height+width/2*height/2*2
Y分量width*height
U分量width/2*height/2
V分量width/2*height/2

 

extern "C" {
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "swscale.lib")
#pragma comment(lib, "avutil.lib")};

YUV422分量实现(YUYV)

static void YUYV422Planes(uint8_t *yuv422, uint8_t *y_ptr, uint8_t *u_ptr, uint8_t *v_ptr, int width, int height)
{//计算出空间大小int numBytes = width*height+width/2*height*2;unsigned int yIndex = 0;unsigned int uIndex = 0;unsigned int vIndex = 0;//分量for (unsigned int i = 0; i < numBytes; i += 4) {memcpy((unsigned char *)y_ptr + yIndex, yuv422+i, 1);yIndex++;memcpy((unsigned char *)u_ptr + uIndex, yuv422+i+1, 1);uIndex++;memcpy((unsigned char *)y_ptr + yIndex, yuv422+i+2, 1);yIndex++;memcpy((unsigned char *)v_ptr + vIndex, yuv422+i+3, 1);vIndex++;}
}

YUV422封包实现(YUYV)

static void YUYV422Packages(uint8_t *yuv422, uint8_t *y_ptr, uint8_t *u_ptr, uint8_t *v_ptr, int width, int height)
{//计算出空间大小int numBytes = width * height + width / 2 * height * 2;unsigned int yIndex = 0;unsigned int uIndex = 0;unsigned int vIndex = 0;//封包for (unsigned int i = 0; i < numBytes; i+=4) {//ymemcpy((unsigned char *)yuv422+i,y_ptr+yIndex,1);yIndex++;//umemcpy((unsigned char *)yuv422+i+1, u_ptr+uIndex, 1);uIndex++;//ymemcpy((unsigned char *)yuv422+i+2, y_ptr+yIndex, 1);yIndex++;//vmemcpy((unsigned char *)yuv422+i+3, v_ptr+vIndex, 1);vIndex++;}
}

YUV420封包实现

static void YUV420PPackages(uint8_t *yuv420, uint8_t *y_ptr, uint8_t *u_ptr,uint8_t *v_ptr, int width, int height)
{//Y分量的长度int yLen = width * height;//U和V分量的长度int uvLen = width / 2 * height / 2;memcpy((unsigned char *)yuv420, y_ptr, yLen);memcpy((unsigned char *)yuv420 + yLen, u_ptr, uvLen);memcpy((unsigned char *)yuv420+yLen+uvLen, v_ptr, uvLen);
}

YUV420分量实现

static void YUV420PPlanes(uint8_t *yuv420, uint8_t *y_ptr, uint8_t *u_ptr,uint8_t *v_ptr, int width, int height)
{//Y分量的长度int yLen = width * height;//U和V分量的长度int uvLen = width / 2 * height / 2;memcpy((unsigned char *)y_ptr, yuv420, yLen);memcpy((unsigned char *)u_ptr, yuv420 + yLen, uvLen);memcpy((unsigned char *)v_ptr, yuv420 + yLen + uvLen, uvLen);
}

YUV420P转YUYV422

static void YUV420P_TO_YUYV422(uint8_t *yuv420p, void *y_ptr, void *u_ptr, void *v_ptr, int width, int height)
{AVFrame *Input_pFrame = nullptr;AVFrame *Output_pFrame = nullptr;struct SwsContext *img_convert_ctx = nullptr; //用于解码后的格式转换/*1. 申请空间*/Input_pFrame = av_frame_alloc();Output_pFrame = av_frame_alloc();/*2.设置转码参数*/img_convert_ctx =sws_getContext(width, height, AV_PIX_FMT_YUV420P, //输入width, height, AV_PIX_FMT_YUYV422, //输出SWS_BICUBIC, nullptr, nullptr, nullptr);int numBytes = avpicture_get_size(AV_PIX_FMT_YUYV422, width, height);//申请空间uint8_t *yuv422 = (uint8_t *)av_malloc(numBytes * sizeof(uint8_t));/*3. 申请转码需要空间*//*4. 设置转码的源数据地址*/avpicture_fill((AVPicture *)Input_pFrame, yuv420p, AV_PIX_FMT_YUV420P,width, height);avpicture_fill((AVPicture *)Output_pFrame, yuv422, AV_PIX_FMT_YUYV422,width, height);//转格式sws_scale(img_convert_ctx, (uint8_t const **)Input_pFrame->data,Input_pFrame->linesize, 0, height, Output_pFrame->data,Output_pFrame->linesize);//yuv422分量YUYV422Planes(yuv422, (uint8_t *)y_ptr, (uint8_t *)u_ptr,(uint8_t *)v_ptr, width, height);//释放空间if (Input_pFrame)av_free(Input_pFrame);if (Output_pFrame)av_free(Output_pFrame);if (yuv422)av_free(yuv422);if (img_convert_ctx)sws_freeContext(img_convert_ctx);
}

YUYV转YUV420P格式

static void YUYV422_TO_YUV420P(uint8_t *yuyv422, uint8_t *yuv420p, int video_width, int video_height)
{AVFrame *Input_pFrame = nullptr;AVFrame *Output_pFrame = nullptr;struct SwsContext *img_convert_ctx = nullptr; //用于解码后的格式转换/*1. 申请空间*/Input_pFrame = av_frame_alloc();Output_pFrame = av_frame_alloc();/*2.设置转码参数*/img_convert_ctx = sws_getContext(video_width, video_height, AV_PIX_FMT_YUYV422, //输入video_width, video_height, AV_PIX_FMT_YUV420P, //输出SWS_BICUBIC, nullptr, nullptr, nullptr);/*3. 申请转码需要空间*//*4. 设置转码的源数据地址*/avpicture_fill((AVPicture *)Input_pFrame, yuyv422, AV_PIX_FMT_YUYV422,video_width, video_height);avpicture_fill((AVPicture *)Output_pFrame, yuv420p, AV_PIX_FMT_YUV420P,video_width, video_height);//转格式sws_scale(img_convert_ctx, (uint8_t const **)Input_pFrame->data,Input_pFrame->linesize, 0, video_height, Output_pFrame->data,Output_pFrame->linesize);//释放空间if (Input_pFrame)av_free(Input_pFrame);if (Output_pFrame)av_free(Output_pFrame);if (img_convert_ctx)sws_freeContext(img_convert_ctx);
}


http://chatgpt.dhexx.cn/article/b9X1oXYF.shtml

相关文章

Android Camera2 YUV420_888 格式详解

Camera2 YUV420_888 官网文档介绍 Android PAI 对 YUV420_888的介绍 &#xff0c;大致意思如下&#xff1a; 它是YCbCr的泛化格式&#xff0c;能够表示任何4:2:0的平面和半平面格式&#xff0c;每个分量用8 bits 表示。带有这种格式的图像使用3个独立的Buffer表示&#xff0c;每…

【音视频数据数据处理 2】【YUV篇】将YUV420P_I420数据旋转90°-180°-270°-镜像旋转

【音视频数据数据处理 2】【YUV篇】将YUV420P_I420数据旋转90 一、理论分析&#xff08;以yuv420p_i420格式为例&#xff09;二、顺时针旋转90 代码实现三、顺时针旋转180 代码实现四、旋转90-180-270-镜像旋转&#xff0c;完整代码实现五、运行结果 本文接着前文&#xff1a; …

YUV420->RGB888格式转换的CPP实现

git地址&#xff1a; GitHub - Evayangelion/EYUVConverter: A YUV converter implemented by cpp 上一次学习了YUV各种采样和存储方式的区别&#xff08;YUV知识存档&#xff09; 接下来一起学习一下RGB格式的知识和YUV到RGB的转换方式 RGB色彩模式的分类 RGB的分类相较YUV来说…

YUV444,YUV420P,YUV420SP,YUV422P,YUV422SP,NV12,NV21,NV16,NV61等格式区分与存储简介

一、基础知识&#xff1a; 概述 YUV是顏色編碼方式&#xff0c;常用於視頻及圖像處理中。 其中的YUV是三個分量。“Y”表示明亮度&#xff08;Luminance或Luma&#xff09;&#xff0c;也就是灰度值。“U”和“V” 表示的是彩色信息&#xff0c;分別爲色度和濃度&#xff08;C…

OpenGL渲染YUV420P

一 、YUV420P数据格式二 、GLFW渲染YUV420P2.1 定义顶点数据2.2 创建YUV三张纹理2.3上行YUV420数据2.4 渲染纹理2.5 着色器 三、代码地址以及存在的问题四 、解决存在的问题 一 、YUV420P数据格式 图片来源于谷歌 结合上图可以看出YUV420P的特点如下&#xff1a; ①无论在横向还…

详解 YUV 格式(I420/YUV420/NV12/NV12/YUV422)

转载自&#xff1a;划水型派大星 YUV &#xff08;YCbCr&#xff09;是一种像素格式&#xff0c;常见于视频编码与静态图像。与 RGB 格式&#xff08;红-绿-蓝&#xff09;相反&#xff0c;YUV 分别由一个称为 Y&#xff08;相当于灰度&#xff09;的“亮度”分量&#xff08;…

ffmpeg学习笔记(2)-YUV420算法原理

ffmpeg学习笔记(2)——YUV420算法原理 一、YUV像素格式 YUV的组成格式如下图所示 Y:明亮度&#xff0c;即灰度值 U、V&#xff1a;颜色 YUV格式将亮度信息和色彩信息分离&#xff0c;没有色彩信息依然能够显示图像&#xff08;没有色彩信息&#xff09;&#xff0c;很好的解…

音视频编解码: YUV存储格式中的YUV420P,YUV420SP,NV12, NV21理解(转)

概述 之前介绍了YUV码流的采样格式&#xff0c;下面分析下YUV码流的存储格式&#xff0c;YUV码流的存储格式与采样格式息息相关。总的来讲&#xff0c;YUV存储格式主要分为两种&#xff1a; planar 平面格式 指先连续存储所有像素点的 Y 分量&#xff0c;然后存储 U 分量&…

图像编码YUV420格式

目录 一、YUV简介 二、RGB 到 YUV 的转换 三、YUV采样 YUV 4:4:4 YUV 4:2:2 YUV 4:2:0 四、YUV 存储格式 基于 YUV 4:2:2 采样的格式 YUYV 格式 UYVY 格式 YUV 422P 格式 基于 YUV 4:2:0 采样的格式 YU12 和 YV12 格式 NV12 和 NV21 格式 一、YUV简介 YUV&#x…

YUV420数据格式详解

YUV简介 YUV格式有两大类&#xff1a;planar和packed。 对于planar的YUV格式&#xff0c;先连续存储所有像素点的Y&#xff0c;紧接着存储所有像素点的U&#xff0c;随后是所有像素点的V。 对于packed的YUV格式&#xff0c;每个像素点的Y,U,V是连续交叉存储的。 YUV分为三个分…

python 生产者消费者模式

生产者消费者模式概述 在并发编程中使用生产者和消费者模式能够解决大不多的并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么使用生产者消费者模式 在线程世界里&#xff0c;生产者就是生产数据的线程&#xff0c;消费者就是…

生产者-消费者模式

概述 生产者-消费者模式在系统交互方面,有几个特点: 1、系统解耦 2、解决并发问题 3、不需要关心对方系统何时处理数据,处理结果如何 下面用几个简单例子逐步说明。 简单例子 假设有两个系统,A系统和B系统,B系统需要依赖A系统产生的数据,也就是说,A系统产生数据后,必须把数…

生产者消费者模式及简单的运用场景

先考虑一个问题&#xff1a;服务端接受多个客户端提交的视频文件进行转码的操作&#xff0c;应该怎么设计&#xff1f; 由于转码比较花费时间&#xff0c;所以我们排除同步的想法。而转码需要用到的外部软件&#xff08;exe文件&#xff09;&#xff0c;不能同时被多个线程用到…

Java多线程系列—生产者消费者模式的多种实现(04)

生产者消费者模式 我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦、消息队列等场景。 在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者,有时生产者的生产速度特别快,但消费者的消…

生产者消费者模式的Java实现

一.概述 1. 什么是“生产者消费者模式”&#xff1f; 生产线程负责生产&#xff0c;消费线程负责消费 生产线程和消费线程要达到均衡。 生产满了就不能继续生产了&#xff0c;必须让消费线程进行消费 消费完了就不能再消费了&#xff0c;必须让生产线程进行生产 这是一种特殊的…

实现生产者消费者模式的三种方式

什么是生产者消费者模式 简单来说&#xff0c;生产者消费者模式就是缓冲区。 那么这么做有两个好处&#xff0c;一个是解耦&#xff0c;第二个是平衡生产能力和消费能力的差&#xff0c;因为生产者和消费者的速度是不一样的&#xff0c;有了这个缓冲区就可以平衡这样一个落差&…

生产者消费者模式最佳实践

测试环境&#xff1a;ubuntu18.04opencv4.2Qt 一个生产者-消费者模式下的视频处理框架。基础结构&#xff1a;视频读取类线程不断读取视频帧&#xff0c;处理类线程对图像进行处理&#xff0c;之后通过信号与槽机制在主线程中显示。特点&#xff1a;视频读取、处理为独立线程&a…

生产者、消费者模式

架构设计&#xff1a;生产者/消费者模式[0]&#xff1a;概述 今天打算来介绍一下“生产者&#xff0f;消费者模式”&#xff0c;这玩意儿在很多开发领域都能派上用场。由于该模式很重要&#xff0c;打算分几个帖子来介绍。今天这个帖子先来扫盲一 把。如果你对这个模式已经比较…

生产者和消费者模式详解

★简介 生产者消费者模式并不是GOF提出的23种设计模式之一&#xff0c;23种设计模式都是建立在面向对象的基础之上的&#xff0c;但其实面向过程的编程中也有很多高效的编程模式&#xff0c;生产者消费者模式便是其中之一&#xff0c;它是我们编程过程中最常用的一种设计模式。…

生产者消费者模式+代码实现

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么要使用生产者和消费者模式 在线程世界里&#xff0c;生产者就是生产数据的线程&#xff0c;消费者就是消费数据的线程。在…