【音视频数据数据处理 1】【YUV篇】分离YUV420P像素数据中的Y、U、V分量
【音视频数据数据处理 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:4
,YUV 4:2:2
,YUV 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 上可以看到图片的所有信息,可以看出,我们当前图片格式为:yuv420p
,I420
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分量相关推荐
- 音视频从入门到精通——FFmpeg分离出PCM数据实战
什么是PCM? PCM(Pulse Code Modulation,脉冲编码调制)音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样.量化.编码转换成的标准数字音频数据. 描述PCM数据的6 ...
- 学习雷霄骅博士博客之分离YUV420P像素数据中的Y、U、V分量时遇到的问题及对应
今天算是正式的第一天开始这方面的学习,以前在公司没活干就很难受,现在则不会了,FFmpeg让我有种焕发第二春的感觉,第一次这种感觉是学习嵌入式C linux等的时候.必须要感谢前辈的引路,告诉我有这么 ...
- 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存 ...
- YUV420P图片分离Y/U/V分量并显示验证
背景 最近在学习音视频编解码相关知识,其中涉及到了YUV相关知识. 想要将一个YUV420P格式图片的三个分量分别保存出来并且显示. 参考 YUV格式的讲解: https://www.bilibili ...
- linux摄像头 sdl,Linux音视频(SDL与YUV)
SDL是一个比较底层的音视频处理库,很多UI系统的内核都用到它,我们还可以用它来处理摄像头中YUV数据. 拓展: SDL(Simple DirectMedia Layer)是一个跨平台的底层开发库,提 ...
- 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 ...
- 【Android音视频开发】【032】Android从RTMP流中提取H264和AAC数据进行播放
前篇 在上篇博客中,我们已经讲解过,如何从RTMP流中提取H264和AAC数据,并保存为FLV,AAC,H264等文件 这篇博客我们讲解,怎么通过Android多媒体框架播放这些数据 上篇博客的重点在 ...
- 音视频大合集最终篇;学废了
前言 加企鹅群:1079654574 解锁 <音视频八大板块资料> 音视频大合集,从初中高到面试应有尽有;让学习更贴近未来实战.已形成PDF版 八个模块内容如下: 1.音视频基础 2.FF ...
- 音视频 测试分享-基础工具篇
在视频直播 方向的测试经验 想借个机会一起分享下,一起提高大家的测试技术 1.测试工具 ffmpeg-强大工具支撑 验证flv ,mp4 等多媒体信息的工具:ffmporb srs-bench:音视频 ...
最新文章
- linux 如何对文件解压或打包压缩
- 算法设计与分析——动态规划——数字三角形问题
- 【渝粤题库】陕西师范大学152102 管理学原理作业(高起专)
- gjr garch Matlab,基于Copula-ARIMA-GJR-GARCH模型的股票指数相关性分析
- openstack nova-network 的小bug的排错经历
- 云开发无需服务期无需域名壁纸小程序源码
- Android OpenGL 使用
- ACM算法设计---BFS、DFS
- 使用Arduino IDE环境学习ESP32--CAM
- Win10注册DLL办法
- 3GPP TS 23502-h20 中英文对照 | 4.15.6.2 NEF service operations information flow
- Python制作古诗生成器
- 原生JS记忆翻牌小游戏
- Python调用腾讯优图OCR通用API实现文字识别
- Unity通过鼠标或者手势实现拉进拉远,旋转等操作的常用方法
- 算法题 金银铜奖牌排序
- 怎么快速缩小gif图大小?gif动图如何变小?
- 靖江最正宗过年习俗 只有3%的人完全继承下来了
- 智能家居新体验:“小摩凳”足部按摩器上架小米有品
- 妈妈试试这样给宝宝穿衣