视频处理学习笔记1:YUYV422、NV12和h264

2024-02-07 16:28

本文主要是介绍视频处理学习笔记1:YUYV422、NV12和h264,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近因为工作关系在恶补视频相关知识点,在此做一记录便于日后复习。
以下均是个人学习经验总结,可能存在错误和坑,欢迎大佬指教。

工作中用到的是YUYV422存储格式。存储的就是裸流YUYV422格式文件。

YUYV422是两个像素点共用一个UV分量,每个像素点2byte,两个像素点也就是Y00 U00 Y01 V00,4byte,也就是Y、U、V每个分量各1byte。存储结构大致如下:

Y00 U00 Y01 V00   Y02 U01 Y03 V01   .......

Y10 U10 Y11 V10   Y12 U11 Y13 V11   .......

Y20 U20 Y21 V20   Y22 U21 Y23 V21   .......

Y30 U30 Y31 V30   Y32 U31 Y33 V31   .......

NV12是四个像素点共用一个UV分量,每个分量1byte。YUYV422转NV12后,存储结构大致如下:

Y00 Y01 Y02 Y03    .......

Y10 Y11 Y12 Y13    .......

Y20 Y21 Y22 Y23    .......

Y30 Y31 Y32 Y33    .......

U01 V01 U03 V03    .......

U21 V21 U23 V23    .......

以下是对应代码:

#include <stdio.h>void yuyv422_to_nv12(char * image_in, char* image_out, int width, int height, unsigned long int filesize)
{/* 计算循环次数,YUYV 一个像素点占2个字节*/int pixNUM = width * height;unsigned int cycleNum = filesize /pixNUM/2;printf("cycleNUM = %d\n",cycleNum);/*单帧图像中 NV12格式的输出图像 Y分量 和 UV 分量的起始地址,并初始化*/char *y = image_out;char *uv = image_out + pixNUM ;char *start = image_in;unsigned int i =0; int j =0,k =0;/*处理Y分量*/for(i= 0; i<cycleNum ;i++){int index =0;for(j =0; j< pixNUM*2; j=j+2) //YUYV单行中每两个字节一个Y分量{*(y+index) = *(start + j);index ++;}start = image_in + pixNUM*2*i;y= y + pixNUM*3/2;}/**处理UV分量**/start = image_in;for(i= 0; i<cycleNum ;i++){int uv_index = 0;for(j=0; j< height; j =j+2)  // 隔行, 我选择保留偶数行{for(k = j*width*2+1; k< width*2*(j+1); k=k+4) //YUYV单行中每四个字节含有一对UV分量{*(uv+ uv_index) = *(start + k);*(uv +uv_index+1) = *(start +k +2);uv_index += 2;}}start = image_in + pixNUM*2*i;uv =uv + pixNUM*3/2;}
}int main(int argc, char **argv) {if (argc < 4) {printf("useage: %s [src] [width]x[height] [dst]\n", argv[0]);return -1;}int width;int height;sscanf(argv[2], "%dx%d", &width, &height);printf("width:%d height:%d \n",width, height);// int col = width;// int row = height;FILE* inFile = NULL;FILE* outFile = NULL;inFile = fopen(argv[1],"rb");if (inFile == NULL) {printf("open src error\n");return -1;}outFile = fopen(argv[3], "wb");if (outFile == NULL) {printf("open dst error\n");fclose(inFile);return -1;}char nv12Buf[height*width*3/2]={0};char yuyvBuf[width*height*2]={0};int frames = 0;while (!feof(inFile)){fread(yuyvBuf, sizeof(yuyvBuf), 1, inFile);yuyv422_to_nv12(yuyvBuf,nv12Buf, width, height, sizeof(yuyvBuf));fwrite(nv12Buf, width*height*3/2, 1, outFile);fflush(outFile);printf("frame:%d\n",++frames);}fclose(outFile);fclose(inFile);
}

这篇关于视频处理学习笔记1:YUYV422、NV12和h264的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688286

相关文章

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos