视频处理学习笔记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

相关文章

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超