YUYV编码成h.264:Linux视频采集与编码(二)

    xiaoxiao2021-04-15  75

    YUYV编码成h.264:Linux视频采集与编码(二)

    标签: h.264linux存储 12737人阅读 评论(5) 收藏 举报 本文章已收录于: 分类: Linux(2) 作者同类文章 X

    用V4L2成功采集到了YUYV视频,然后需要将它编码成h.264文件,因为之前有做过将yuv420编码成h.264的程序,所以觉得将yuv422编码成h.264也是大同小异,应该挺简单的。

    于是我很开心的写编码函数了,编码yuv420我是参考的这篇和这篇博文,我马上下手,我感到圣母玛丽亚正在向我招手,我觉得我马上就要成功啦 ^_^

    可是,我知道,作为一个程序员,如果不遇上一些问题,不遇到一些困难,都会不好意思滴 ^_^

    是啊,我遇到困难了,我编码出来的视频是花的,红红绿绿,好像春天百花齐放!

    因为参考编码yuv420的代码中也是隔行扫描的,它的yuv序列是下面这样:

    YYYY

    YYYY

    UVUV

    于是我天真的认为我的yuv422保存的也是这样的序列,因为它们都是隔行扫描啊。

    后来知道了YUYV隔行扫描序列不是这样的,yuv422的序列应该是下面这样:

    YU YV YU YV YU YV

    就是说UV确实是交叉存储,只不过得和Y一起交叉。

    知道了这样的存储序列,要把其编码成h.264就简单啦。

    下面看我的编码代码:

    [cpp] view plain copy print ? char *y = en->picture->img.plane[0];      char *u = en->picture->img.plane[1];      char *v = en->picture->img.plane[2];        int is_y = 1, is_u = 1;      int y_index = 0, u_index = 0, v_index = 0;        int yuv422_length = 2 * en->param->i_width * en->param->i_height;        //序列为YU YV YU YV,一个yuv422帧的长度 width * height * 2 个字节      for (i = 0; i < yuv422_length; ++i) {          if (is_y) {              *(y + y_index) = *(in + i);              ++y_index;              is_y = 0;          } else {              if (is_u) {                  *(u + u_index) = *(in + i);                  ++u_index;                  is_u = 0;              } else {                  *(v + v_index) = *(in + i);                  ++v_index;                  is_u = 1;              }              is_y = 1;          }      }   char *y = en->picture->img.plane[0]; char *u = en->picture->img.plane[1]; char *v = en->picture->img.plane[2]; int is_y = 1, is_u = 1; int y_index = 0, u_index = 0, v_index = 0; int yuv422_length = 2 * en->param->i_width * en->param->i_height; //序列为YU YV YU YV,一个yuv422帧的长度 width * height * 2 个字节 for (i = 0; i < yuv422_length; ++i) { if (is_y) { *(y + y_index) = *(in + i); ++y_index; is_y = 0; } else { if (is_u) { *(u + u_index) = *(in + i); ++u_index; is_u = 0; } else { *(v + v_index) = *(in + i); ++v_index; is_u = 1; } is_y = 1; } } 注:in 是指向yuv422序列的指针,即指向了yuv422的起始地址。

    我们只要将yuv422序列中的 

    y 赋值给 plane[0]

    u 赋值给 plane[1]

    v 赋值给 plane[2], 就可以编码了。

    顶 2 踩 0     上一篇V4L2采集yuv视频花屏:Linux视频采集与编码(一) 下一篇V4L2视频采集与H.264编码源码大放送:Linux视频采集与编码(三)

    我的同类文章

    Linux(2) http://blog.csdn.net •V4L2视频采集与H.264编码源码大放送:Linux视频采集与编码(三)2012-05-03阅读18600 •V4L2采集yuv视频花屏:Linux视频采集与编码(一)2012-05-01阅读16153
    转载请注明原文地址: https://ju.6miu.com/read-670865.html

    最新回复(0)