本文初衷是博主学习所用,学习雷神文章整理成自己笔记,希望雷神理解
本文是对视频原始数据——像素数据的分析
1.使用ffmpeg进行图片转化
1.查看支持的YUV格式
ffmpeg -pix_fmts
2.把图片转化成YUV
ffmpeg -i test.jpg -s 256x256 -pix_fmt yuv420p test.yuv
(-pix_fmt yuv420p需要添加上,如果不添加的话,往往转码结果为yuv444格式,如果需要转换其他格式图片,只需要将jpg替换成bmp或者png即可)
2.使用ffplay查看图片
采用ffplay 查看YUV数据包括视频或者图片
ffplay [-f rawvideo] -video_size 256x256 test.yuv
注:
(1)-f rawvideo : 经笔者测试这个选项可加可不加。
(2)yuv文件不包涵宽高数据所以必须用-video_size指定宽和高,格式为:widthxheight
(3)test.yuv可以是一帧(图片)或者多帧(视频)数据
(4)其他图片形式不用可以不用加-video_size指定宽和高
如:ffplay 1.jpg
3.什么是YUV
YUV,是一种颜色编码方法。常使用在各个视频处理组件中。 YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。
YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma)。
具体可以看YUV
4.yuv播放器
http://www.yuvplayer.com/下载可能有点慢,打开后注意选择YUVsize大小,因为YUV默认没有大小信息。除此之外,还有设置YUV格式。
5.写代码把YUV图片转成Y、U、V格式
在vs运行
#include <iostream>
using namespace std;
/**
* Split Y, U, V planes in YUV420P file.
* @param url Location of Input YUV file.
* @param w Width of Input YUV file.
* @param h Height of Input YUV file.
* @param num Number of frames to process.
*
*/
int simplest_yuv420_split(const char *url, int w, int h, int num) {
FILE *fp = fopen(url, "rb+");
FILE *fp1 = fopen("output_420_y.y", "wb+");
FILE *fp2 = fopen("output_420_u.y", "wb+");
FILE *fp3 = fopen("output_420_v.y", "wb+");unsigned char *pic = (unsigned char *)malloc(w*h * 3 / 2);
cout << "s" << endl;
for (int i = 0; i < num; i++) {
fread(pic, 1, w*h * 3 / 2, fp);
//Y
fwrite(pic, 1, w*h, fp1);
//U
fwrite(pic + w * h, 1, w*h / 4, fp2);
//V
fwrite(pic + w * h * 5 / 4, 1, w*h / 4, fp3);
}
cout << "s" << endl;
free(pic);
fclose(fp);
fclose(fp1);
fclose(fp2);
fclose(fp3);return 0;
}
int main() {
simplest_yuv420_split("test.yuv", 256, 256, 1);
system("Pause");
return 0;
}
从代码可以看出,如果视频帧的宽和高分别为w和h,那么一帧YUV420P像素数据一共占用w*h*3/2 Byte的数据。其中前w*h Byte存储Y,接着的w*h*1/4 Byte存储U,最后w*h*1/4 Byte存储V。上述调用函数的代码运行后,将会把一张分辨率为256x256的名称为test.yuv的YUV420P格式的像素数据文件分离成为三个文件:
output_420_y.y:纯Y数据,分辨率为256x256。
output_420_u.y:纯U数据,分辨率为128x128。
output_420_v.y:纯V数据,分辨率为128x128。注:本文中像素的采样位数一律为8bit。由于1Byte=8bit,所以一个像素的一个分量的采样值占用1Byte。
6.使用YUV播放器播放Y、U、V
output_420_y.y
output_420_u.y和output_420_v.y