您的位置:首页 > 运维架构 > Linux

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

2017-04-13 22:59 330 查看

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

标签:
h.264linux存储

2012-05-01 20:39
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: