【音视频数据数据处理 1】【YUV篇】分离YUV420P像素数据中的Y、U、V分量

  • 一、YUV420P 数据格式介绍
  • 二、分离YUV420P像素数据中的Y、U、V分量 - 代码实现
  • 三、查看生成的YUV分量文件
    • 1. 查看 yuv420p_i420.y 文件
    • 2. 查看 yuv420p_i420.u 文件
    • 3. 查看 yuv420p_i420.v 文件

本文开始参考雷神雷霄骅的文章,开始自已写代码学习。

视频像素数据在视频播放器的解码流程中的位置如下图所示。

在学习之前,先准备好一张YUV图片。
从网上下载一张 720x480 的 jpg 图片,通过 ffmpeg.exe 工具,将其转换成YUV420P 格式的图片。

JPG转YUV420P命令:ffmpeg -i Test.jpg -s 720x480 -pix_fmt yuv420p test.yuv
ffplay查看YUV420P图片命令:ffplay.exe -video_size 720x480 -pix_fmt yuv420p test.yuv

图片素材已上传CSDN:
《[素材]分离YUV420P像素数据中的Y、U、V分量.zip》
《【c代码+素材】分离YUV420P中的YUV分量.zip》

素材准备好了,我们开始写代码吧。

本文链接:《【音视频数据数据处理 1】【YUV篇】分离YUV420P像素数据中的Y、U、V分量》

一、YUV420P 数据格式介绍

  • YUV 格式有两大类:planar 和 packed
    对于planar 的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
    对于packed 的YUV格式,每个像素点的Y,U,V是连续交叉存储的。

  • YUV 分为三个分量
    “Y”表示明亮度(Luminance或Luma),也就是灰度值;
    而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,
它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,
这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。
并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV 4:4:4YUV 4:2:2YUV 4:2:0

本文目前重点关注 YUV420P,其格式如下:

I420: YYYYYYYY UU VV             =>YUV420P
YV12: YYYYYYYY VV UU            =>YUV420P
NV12: YYYYYYYY UV UV            =>YUV420SP
NV21: YYYYYYYY VU VU            =>YUV420SPYV12 : 亮度(行×列) + U(行×列/4) + V(行×列/4)
I420 : 亮度(行×列) + V(行×列/4) + U(行×列/4)

二、分离YUV420P像素数据中的Y、U、V分量 - 代码实现

在查看图片时,我们从 ffplay 上可以看到图片的所有信息,可以看出,我们当前图片格式为:yuv420pI420

Input #0, rawvideo, from 'test.yuv':Duration: 00:00:00.04, start: 0.000000, bitrate: 103680 kb/sStream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 720x480, 103680 kb/s, 25 tbr, 25 tbn, 25 tbc

因些,test.yuv 的图像存储格式为: YY YY YY YY UU VV

test.yuv 分辨率为,720x480,也就是有720x480个像素点,所以其存储格式为:

test.yuv = 720x480个Y + 720x480个U + 720x480个V

好,确定了存储格式,我们开始写代码吧。


#include <stdio.h>
#include <stdlib.h>// 分离 YUV420P I420 格式图片的YUV分量
// 格式为:YY YY YY YY ... UU...VV
void Split_YUV420_I420(char *path, int width, int height)
{FILE *file = fopen(path, "rb+");   //只读打开源文件FILE *file_y = fopen("yuv420p_i420.y", "wb+");   //可读可写创建 Y分量文件 FILE *file_u = fopen("yuv420p_i420.u", "wb+"); //可读可写创建 U分量文件 FILE *file_v = fopen("yuv420p_i420.v", "wb+"); //可读可写创建 V分量文件 // 申请 width * hight * 3 / 2 的内存unsigned char *p, *pic = (unsigned char *)malloc(sizeof(char) * width * height * 3 / 2);size_t num=0;num = fread(pic, 1, width*height*3/2, file);  // 读取源图片的所有内容,每个数据块为1字节 printf("读取 %d 个字节的数据\n", num);            p = pic;num = fwrite(p, 1, width * height, file_y);   // 保存Y分量,pic[0, width*height] ,每个数据块写1字节 printf("写入 %d 个字节的数据\n", num);            p = p + width * height;num = fwrite(p, 1, width * height / 4, file_u); // 保存U分量,pic[width*height, width*height*5/4] ,每个数据块写1字节 printf("写入 %d 个字节的数据\n", num);       p = p + width * height / 4;num = fwrite(p, 1, width * height / 4, file_v); // 保存V分量,pic[width*height*5/4, width*height*3/2] ,每个数据块写1字节 printf("写入 %d 个字节的数据\n", num);free(pic);fclose(file);fclose(file_y);fclose(file_u);fclose(file_v);
}int main(void)
{char path[]="yuv420p_i420.yuv";Split_YUV420_I420(path, 720, 480);return 0;
}

运行结果为:生成了yuv420p_i420.y、yuv420p_i420.u、yuv420p_i420.v 三个文件

读取 518400 个字节的数据
写入 345600 个字节的数据
写入 86400 个字节的数据
写入 86400 个字节的数据
请按任意键继续. . .

三、查看生成的YUV分量文件

查看工具为:YUV Player Deluxe

1. 查看 yuv420p_i420.y 文件

2. 查看 yuv420p_i420.u 文件

由于YUV420中,2个像素点,才会对应一个u,所以,查看 u 分量文件时,需要配置size为原size 的一半。

3. 查看 yuv420p_i420.v 文件

《视音频数据处理入门:RGB、YUV像素数据处理》
《图文详解YUV420数据格式》

【音视频数据数据处理 1】【YUV篇】分离YUV420P像素数据中的Y、U、V分量相关推荐

  1. 音视频从入门到精通——FFmpeg分离出PCM数据实战

    什么是PCM? PCM(Pulse Code Modulation,脉冲编码调制)音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样.量化.编码转换成的标准数字音频数据. 描述PCM数据的6 ...

  2. 学习雷霄骅博士博客之分离YUV420P像素数据中的Y、U、V分量时遇到的问题及对应

    今天算是正式的第一天开始这方面的学习,以前在公司没活干就很难受,现在则不会了,FFmpeg让我有种焕发第二春的感觉,第一次这种感觉是学习嵌入式C linux等的时候.必须要感谢前辈的引路,告诉我有这么 ...

  3. YUV像素数据分解为 Y ,U, V分量

    如果视频帧的宽和高分别为w和h,那么一帧YUV420P像素数据一共占用w*h*3/2 Byte的数据.其中前w*h Byte存储Y,接着的w*h*1/4 Byte存储U,最后w*h*1/4 Byte存 ...

  4. YUV420P图片分离Y/U/V分量并显示验证

    背景 最近在学习音视频编解码相关知识,其中涉及到了YUV相关知识. 想要将一个YUV420P格式图片的三个分量分别保存出来并且显示. 参考 YUV格式的讲解: https://www.bilibili ...

  5. linux摄像头 sdl,Linux音视频(SDL与YUV)

    SDL是一个比较底层的音视频处理库,很多UI系统的内核都用到它,我们还可以用它来处理摄像头中YUV数据. 拓展: SDL(Simple DirectMedia Layer)是一个跨平台的底层开发库,提 ...

  6. Atitit ffmpeg功能表 多媒体处理类库工具 音频视频 1.1.ffmpeg音视频合成  1.2.Atitit 视频音频分离 提取法 1.3.ffmpeg对视频封装和分离 使用ffmpeg对

    Atitit ffmpeg功能表 多媒体处理类库工具 音频视频 目录 1.1. ffmpeg音视频合成 1 1.2. Atitit 视频音频分离 提取法 1 1.3. ffmpeg对视频封装和分离 1 ...

  7. 【Android音视频开发】【032】Android从RTMP流中提取H264和AAC数据进行播放

    前篇 在上篇博客中,我们已经讲解过,如何从RTMP流中提取H264和AAC数据,并保存为FLV,AAC,H264等文件 这篇博客我们讲解,怎么通过Android多媒体框架播放这些数据 上篇博客的重点在 ...

  8. 音视频大合集最终篇;学废了

    前言 加企鹅群:1079654574 解锁 <音视频八大板块资料> 音视频大合集,从初中高到面试应有尽有;让学习更贴近未来实战.已形成PDF版 八个模块内容如下: 1.音视频基础 2.FF ...

  9. 音视频 测试分享-基础工具篇

    在视频直播 方向的测试经验 想借个机会一起分享下,一起提高大家的测试技术 1.测试工具 ffmpeg-强大工具支撑 验证flv ,mp4 等多媒体信息的工具:ffmporb srs-bench:音视频 ...

最新文章

  1. linux 如何对文件解压或打包压缩
  2. 算法设计与分析——动态规划——数字三角形问题
  3. 【渝粤题库】陕西师范大学152102 管理学原理作业(高起专)
  4. gjr garch Matlab,基于Copula-ARIMA-GJR-GARCH模型的股票指数相关性分析
  5. openstack nova-network 的小bug的排错经历
  6. 云开发无需服务期无需域名壁纸小程序源码
  7. Android OpenGL 使用
  8. ACM算法设计---BFS、DFS
  9. 使用Arduino IDE环境学习ESP32--CAM
  10. Win10注册DLL办法
  11. 3GPP TS 23502-h20 中英文对照 | 4.15.6.2 NEF service operations information flow
  12. Python制作古诗生成器
  13. 原生JS记忆翻牌小游戏
  14. Python调用腾讯优图OCR通用API实现文字识别
  15. Unity通过鼠标或者手势实现拉进拉远,旋转等操作的常用方法
  16. 算法题 金银铜奖牌排序
  17. 怎么快速缩小gif图大小?gif动图如何变小?
  18. 靖江最正宗过年习俗 只有3%的人完全继承下来了
  19. 智能家居新体验:“小摩凳”足部按摩器上架小米有品
  20. 妈妈试试这样给宝宝穿衣

热门文章

  1. 别再吐槽 notebook!分享4个解决版本控制的高效工具!
  2. 模拟电路设计(26)---D/A转换器电路原理
  3. Ubuntu的软件包管理 || 软硬链接 ||进线程浅述
  4. 狂神redis学习笔记
  5. 坚守初心,白鹭引擎七年之痒
  6. Notpad++下载和插件安装
  7. 用HTML写一个2023跨年动画代码(烟花+自定义文字+背景音乐+雪花+倒计时)
  8. NRF52832开发:普通串口驱动
  9. U盘中病毒,除病毒,要除根
  10. vs新建网站选项只有wcf服务器,WCF教程一:新建并部署