文中图片源于李超老师,仅作个人笔记
目录:
视频
图像
像素
分辨率
RGB
屏幕
图像与屏幕的关系
RGB色彩问题
分辨率与宽高比
帧率
码流
YUV,以及各个分量
YUV与RGB的关系
YUV常见格式
YUV 的存储格式
ffmpeg 关于 YUV的几条命令
分辨率
分辨率:横向的像素个数 * 纵向的像素个数
RGB
屏幕
由无数的发二极管组成的屏幕,每三个发光二极管(红 绿 蓝)组成一个像素,根据我们的图像数据,颜色信息,去控制屏幕上这些发光二极管,从而形成不同的颜色,最终形成我们真正看到的颜色。
图像与屏幕的关系
RGB色彩问题
有些时候 图像并不是RGB格式,而是BGR格式。所以有些图像展示的时候 颜色不对,就是因为他本身的数据格式是BGR,也是三原色,但是三原色的排列顺序 与 RGB格式是不同的,所以最终送给显示器去显示的时候,送的是BGR数据,而显示器的驱动并不知道数据的格式,他都是以RGB的数据格式来处理 并在屏幕上渲染,所以呈现出来的色彩效果当然不对。
所以对于这种BGR数据 要做格式转换,转换成RGB数据,再送给驱动处理。
BMP格式的图像文件 使用的是 BGR格式,所以显示BMP格式图像的时候,需要先做一个格式转换,将BGR格式的数据抓换位 RGB格式 再送给驱动处理。
PPI : 每英寸的像素数,和分辨率很类似,但是这个指标表述的是一个屏幕的质量,如这个屏幕一寸长的距离内一共放了几个像素点。
DPI : 每英寸的点数,和PPI类似
当一英寸距离内放置像素数超过300,就属于视网膜级别,即我们人眼已经区分不出来 它里面是由像素组成的。
分辨率与宽高比
视频的格式常见的宽高比 16/9 4/3(以前的老电视 显示器)。对于视频的宽高比不是 16/9 或者 4/3的视频,那他属于非标准的视频分辨率,对于这类分辨率,我们要做转换,将其宽高比 转换成 16/9或者4/3
帧率
YUV 以及各个分量
与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽
为什么要使用YUV: YUV 存储的数据要比 RGB少很多
YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色
YUV与RGB的关系
YUV 的存储格式
RGB 的码流,如果换算成以位为单位的码流 就要乘8,因为在网络传输的时候是以位为单位的,如 1M的带宽,实际是指1M 的比特位,而不是1M的字节数。
YUV的码流 换算与 RGB类似
1 先使用ffmpeg 从多媒体文件中获取到 YUV数据
ffmpeg -i input.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv
ffmpeg -i input.mp4
-an //:audiono 表示没有音频,过滤音频
-c:v rawvideo // codec:video 表示视频编解码,rawvideo 表示对多媒体文件中视频 使用rawvideo做处理,获取YUV数据
-pix_fmt yuv420p out.yuv // 指定输出的YUV数据格式为 yuv420p
2 播放 YUV
ffplay -pix_fmt yuv420p -s 608x368 out.yuv
ffplay
-pix_fmt yuv420p //指定播放的格式
-s 608x368 //指定播放分辨率
out.yuv
3 播放 Y 分量
ffplay -pix_fmt yuv420p -s 608x368 -vf extractplanes=‘y’ out.yuv
ffplay -pix_fmt yuv420p -s 608x368
-vf extractplanes='y' // -vf 表明滤波 从YUV数据中 单独播放Y分量
out.yuv
4 提取 各个分量
ffplay -i file.mp4 -filter_comples ‘extractplanes=y+u+v[y][u][v]’ -map ‘[y]’ y.yuv -map ‘[u]’ u.yuv -map ‘[v]’ v.yuv
ffplay -i file.mp4
-filter_comples //复杂滤波
'extractplanes=y+u+v[y][u][v]' //从YUV数据中 单独播放 Y分量 U分量 V分量 综括号中的代表前面的别名
-map '[y]' y.yuv // -map y用于有多个输出是使用,引用 别名,生成需要的文件
-map '[u]' u.yuv
-map '[v]' v.yuv
5 播放 Y分量,注意播放格式
ffplay -pix_fmt gray -s 608x368 y.yuv
ffplay
-pix_fmt gray //播放格式是 单色 并不是完整的YUV数据
-s 608x368 y.yuv
6 播放 U分量,注意 播放格式 ,分辨率
ffplay -pix_fmt gray -s 304x184 y.yuv
ffplay
-pix_fmt gray //播放格式是 单色 并不是完整的YUV数据
-s 304x184 y.yuv //分辨率应该是 原YUV整体数据分辨率的一半:304x184
播放V分量 与 U分量类似