1.ffmpeg:RGB、YUV像素数据处理

本文初衷是博主学习所用,学习雷神文章整理成自己笔记,希望雷神理解

参考雷神:视音频数据处理入门:RGB、YUV像素数据处理

本文是对视频原始数据——像素数据的分析

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, YCbCrYPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度浓度(Chrominance、Chroma)。

具体可以看YUV

4.yuv播放器

http://www.yuvplayer.com/下载可能有点慢,打开后注意选择YUVsize大小,因为YUV默认没有大小信息。除此之外,还有设置YUV格式。


5.写代码把YUV图片转成Y、U、V格式

参考视音频数据处理入门:RGB、YUV像素数据处理

在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

猜你喜欢

转载自blog.csdn.net/weixin_40535588/article/details/89946747
今日推荐