4412 移植x264并且YUV422转x264
转自http://blog.sina.com.cn/s/blog_af9acfc60101alxx.html
一、YUV422转换规律
做视频采集与处理,自然少不了要学会分析YUV数据。因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264、MPEG视频编解码)的角度来说,也是在原始YUV码流进行编码和解析,所以,了解如何分析YUV数据流对于做视频领域的人而言,至关重要。本文就是根据我的学习和了解,简单地介绍如何分析YUV数据流。
YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。
好了,言归正传,谈谈如何分析YUV码流吧。YUV码流有多种不同的格式,要分析YUV码流,就必须搞清楚你面对的到底是哪一种格式,并且必须搞清楚这种格式的YUV采样和分布情况。下面我将介绍几种常用的YUV码流格式,供大家参考。
YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0,关于其详细原理,可以通过网上其它文章了解,这里我想强调的是如何根据其采样格式来从码流中还原每个像素点的YUV值,因为只有正确地还原了每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来。
1.1 YUV格式
为了方便后面叙述,图片的大小定 义为:w * h,宽高分别为w和h
YUV420格式
先Y,后V,中间是U。其中的Y是w * h,U和V是w/2 * (h/2)
如果w = 4,h = 2,则:
yyyy
yyyy
uu
vv
内存则是:yyyyyyyyuuvv
需要占用的内存:w * h * 3 / 2
采样规律是:每个像素点都采样Y,寄数行采样1/2个U,不采样V,偶数行采样1/2个V,不采样U
YUV422格式
本格式使用较为广泛
每两个点为一组,共占用4个字节
YUYVYUYV…
对于每一组YUYV,前面一个Y和本组中的UV组成第一个点,第二个Y和本组中的UV组成第二个点
所以,在内存中,宽高分别为w * 2、h。
如果w = 4,h = 2,则:
YUYVYUYV
YUYVYUYV
需要占用的内存:w * h * 2
UYUY422格式
本格式和YUYV422一样,只是YUV的位置不一样罢了
每组中YUV的排列顺序为:UYUV
需要占用的内存:w * h * 2
YUV的采样格式及每种格式中单像素所占内 存大小
YUV主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。
采样格式 单像素所占内存大小 存放的码流
YCbCr 4:4:4 3byte Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3(4像素为例)
YCbCr 4:2:2 2byte Y0 U0 Y1 V1 Y2 U2 Y3 V3(4像素为例)
YCbCr 4:2:0 1.5byte Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8(8像素为例)
YCbCr 4:1:1 1.5byte Y0 U0 Y1 Y2 V2 Y3(4像素为例)
1.2 存储方式
下面我用图的形式给出常见的YUV码流的存储方式,并在存储方式后面附有取样每个像素点的YUV数据的方法,其中,Cb、Cr的含义等同于U、V。
(1) YUVY 格式 (属于YUV422)
YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y'00、Y'01
而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。
(2) UYVY 格式
(属于YUV422)

UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样。
(3)
YUV422P(属于YUV422)
YUV422P也属于YUV422的一种,它是一种Plane模式,即打包模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y'00、Y'01
而言,其Cb、Cr的值均为 Cb00、Cr00。
二、移植x264
首先下载对应的源文件http://ftp.videolan.org/pub/videolan/x264/snapshots/
我选择了x264-snapshot-20181021-2245-stable.tar.bz2
tar jxvf x264-snapshot---stable.tar.bz ./configure --host=arm-linux --prefix=/opt/wecam/ffmpeg --enable-shared --disable-asm host:是要使用的平台
prefix:是make install的目录
enable-shared:是使能动态链接库
disable-asm:是关闭汇编命令
然后需要修改config.mak文件

然后运行指令:
make
make install
然后在/opt/wecam/ffmpeg目录下就有了对应的文件:

然后把libx264.so.155和pkgconfig目录放到4412开发板的/lib目录,再用指令创建软链接
ln -s libx264.so. libx264.so
而头文件x264.h是编译程序时需要使用的头文件
三、使用库编写YUV422转x264应用
#include <stdio.h>
#include <stdlib.h> #include "stdint.h" #include "include/x264.h" int main(int argc, char *argv[])
{
int ret;
int y_size;
int i, j; if(argc != ) {
printf("usage: %s [source file] [dest file] \n", argv[]);
return -;
} //source file
FILE *fp_src = fopen(argv[], "rb");
FILE *fp_dst = fopen(argv[], "wb"); //Encode 0 frame
int frame_num = ;
int csp = X264_CSP_I422; //YUYV
int width=,height=; //640*480 int iNal = ;
x264_nal_t *pNals = NULL;
x264_t *pHandle = NULL;
x264_picture_t *pPic_in = (x264_picture_t *)malloc(sizeof(x264_picture_t));
x264_picture_t *pPic_out = (x264_picture_t *)malloc(sizeof(x264_picture_t));
x264_param_t *pParam = (x264_param_t *)malloc(sizeof(x264_param_t)); if(fp_src == NULL || fp_dst == NULL) {
printf("Error open files.\n");
return -;
} x264_param_default(pParam);
pParam->i_width = width;
pParam->i_height = height;
pParam->i_csp = csp;
x264_param_apply_profile(pParam, x264_profile_names[]);
pHandle = x264_encoder_open(pParam); x264_picture_init(pPic_out);
x264_picture_alloc(pPic_in, csp, pParam->i_width, pParam->i_height);
y_size = pParam->i_width * pParam->i_height;
printf("w:%d h:%d\r\n",pParam->i_width,pParam->i_height); //detect frame number
if(frame_num == ) {
fseek(fp_src, , SEEK_END);
switch(csp) {
case X264_CSP_I444:
frame_num = ftell(fp_src)/(y_size*);
break;
case X264_CSP_I420:
frame_num = ftell(fp_src)/(y_size*/);
break;
case X264_CSP_I422:
frame_num = ftell(fp_src)/(y_size*);
break;
default:
printf("Colorspace Not Support.\n");
return -;
}
fseek(fp_src, , SEEK_SET);
} printf("frame_num:%d y_size:%d\r\n",frame_num,y_size);
//Loop to Encode
for(i=;i<frame_num;i++) {
switch(csp) {
case X264_CSP_I444:
fread(pPic_in->img.plane[], y_size, , fp_src);
fread(pPic_in->img.plane[], y_size, , fp_src);
fread(pPic_in->img.plane[], y_size, , fp_src);
break;
case X264_CSP_I420:
fread(pPic_in->img.plane[], y_size, , fp_src);
fread(pPic_in->img.plane[], y_size/, , fp_src);
fread(pPic_in->img.plane[], y_size/, , fp_src);
break;
case X264_CSP_I422:
{
int index = ;
int y_i = , u_i = , v_i = ;
for(index = ; index < y_size*; ) {
fread(&pPic_in->img.plane[][y_i++], , , fp_src); //Y
index++;
fread(&pPic_in->img.plane[][u_i++], , , fp_src); //U
index++;
fread(&pPic_in->img.plane[][y_i++], , , fp_src); //Y
index++;
fread(&pPic_in->img.plane[][v_i++], , , fp_src); //V
index++;
}
break;
}
default:
printf("Colorspace Not Support.\n");
return -;
} pPic_in->i_pts = i;
ret = x264_encoder_encode(pHandle, &pNals, &iNal, pPic_in, pPic_out);
if(ret < ) {
printf("Error.\n");
return -;
} printf("Succeed encode frame: %5d\n", i); for(j=;j<iNal;j++) {
fwrite(pNals[j].p_payload, , pNals[j].i_payload, fp_dst);
}
} //flush encoder
while() {
ret = x264_encoder_encode(pHandle, &pNals, &iNal, NULL, pPic_out);
if(ret == )
break;
printf("Flush 1 frame.\n");
for(j=;j<iNal;j++)
fwrite(pNals[j].p_payload, , pNals[j].i_payload, fp_dst);
}
x264_picture_clean(pPic_in);
x264_encoder_close(pHandle);
pHandle = NULL; free(pPic_in);
free(pPic_out);
free(pParam); fclose(fp_src);
fclose(fp_dst); return ;
}
然后是Makefile文件
encode_h264:
arm-none-linux-gnueabi-gcc encode_h264.c -o encode_h264 -L./lib/ -lx264
cp encode_h264 /home/topeet/linux/camera/x264_code
clean:
rm -f encode_h264
打完收工!
4412 移植x264并且YUV422转x264的更多相关文章
- x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1
文章文件夹: x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1 x264 编码器选项分析 (x264 Codec Strong and Weak P ...
- x264 编码器选项分析 (x264 Codec Strong and Weak Points) 2
文章目录: x264 编码器选项分析 (x264 Codec Strong and Weak Points) 1 x264 编码器选项分析 (x264 Codec Strong and Weak Po ...
- 4412 移植mpu9250尝试
4412的板子IO都是1.8v的.只有I2C6是用了电平转换到了3.3v.所以我准备使用I2C6来驱动mpu9250 一.首先去掉占用的模块 menuconfig中去掉触摸的驱动 Device Dri ...
- X264库直接压缩BITMAP格式数据
最近帮朋友看了下X264压缩视频,主要参考了雷霄骅(leixiaohua1020)的专栏的开源代码: http://blog.csdn.net/leixiaohua1020/article/detai ...
- x264 - 高品质 H.264 编码器
转自:http://www.5i01.cn/topicdetail.php?f=510&t=3735840&r=18&last=48592660 H.264 / MPEG-4 ...
- 2016-06-06:X264码率控制
H.264与x264 H264是一个视频压缩编码标准.https://zh.wikipedia.org/wiki/H.264/MPEG-4_AVC X264实现H264视频压缩标准的开源项目.http ...
- 转:视频压缩的基本概念(x264解压包)
第1页:前言——视频压缩无处不在H.264 或者说 MPEG-4 AVC 是目前使用最广泛的高清视频编码标准,和上一代 MPEG-2.h.263/MPEG-4 Part4 相比,它的压缩率大为提高,例 ...
- Android camera采集视频 X264编码
参考 http://blog.csdn.net/zblue78/article/details/6058147 感谢 ExperiencesOfCode 硬件平台:CPU Intel G630 @2. ...
- X264的版本号
0 X264官方地扯 http://www.videolan.org/developers/x264.html 1 X264官方编译的二进制程序命名格式 官方编译出了LINUX,Win32,Win64 ...
随机推荐
- mysql_Qcahce
.cpu mem disk 如果是固态硬盘ssd那就是高速公路 火箭 高铁 普通公路 mysql 配置文件:windows 下 mysql.ini linux:my.cnf lamp路径:/opt/l ...
- 使用spring提供的@Scheduled注解创建定时任务
使用方法 操作非常简单,只要按如下几个步骤配置即可 1. 导入jar包或添加依赖,其实定时任务只需要spring-context即可,当然起服务还需要spring-web: 2. 编写定时任务类和方法 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_02 泛型_6_泛型通配符
泛型通配符是一个问号 也是代表不确定的意思 换成Object两个都报错了. 泛型是没有继承概念的,所以上面写Object就会报错.这里应问号 可以代表位置类型 it.next会自动用Object接收 ...
- B-/B+树 MySQL索引结构
索引 索引的简介 简单来说,索引是一种数据结构 其目的在于提高查询效率 可以简单理解为“排好序的快速查找结构” 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在中磁 ...
- lateral view 使用方法
这个函数相当于拆开行变成列. 可以理解为行转列. select id,order_label from table_bx lateral view explode(split(work_order_l ...
- 剑指offer(1):数组
1 写作计划 最近在看<剑指offer>,发现自己有很多的数据结构与算法的基础知识要复习,<好书一起读(131):让写作更好>中提到用写作倒逼阅读,我很是赞同.所以,计划以&l ...
- linux下安装nginx(nginx(nginx-1.8.0.tar.gz),openssl(openssl-fips-2.0.9.tar.gz) ,zlib(zlib-1.2.11.tar.gz),pcre(pcre-8.39.tar.gz))
:要按顺序安装: 1:先检查是否安装 gcc ,没有先安装:通过yum install gcc-c++完成安 2:openssl : tar -zxf openssl-fips-2.0.9.tar. ...
- 宝塔 windows下apache环境下禁止某文件夹内运行PHP脚本、禁止访问文件
首先我们来看两段对上传目录设置无权限的列子,配置如下: //在宝塔下如用/upload这个路径应用无效,一定要C:/wwwroot/upload才有效果 <Directory "要去掉 ...
- Python3的基本数据类型
2.1. Python3中六个标准的基本数据类型: Number(数字) String(字符串) Sets(集合) Tuple(元组) List(列表) Dictionary(字典) 2.2. Pyt ...
- Hibernate的HQL多表查询
HQL的内连接查询 对于HQL内链接查询,查询的是两张表的数据,这两张表的数据首先是保存在数组之中,然后在将每一个数组保存在List集合之中进行返回 代码片段: @Test // 内连接 public ...