前几天在网上买个罗技的c270摄像头,它支持yuyv(yuv422)和jpeg数据输出。它规格书上写的是支持hd720p(1280*720像素),在实际的调试过程中,我使用该分辨率会导致数据采集过慢。这里需要注意一下,罗技的摄像头c270在有些虚拟机上使用是有异常的,有些是不能映射到虚拟机上,有些是映射过去操作非常缓慢。因为之前在自己的开发板上调试过yuv420的摄像头,在此基础上改为yuyv数据格式,调试的时候还是遇到不少的问题。
在pc上编译x264,可以直接执行下面三条命令:
./configure --enable-shared
make
make install
下面贴出x264部分的代码:
/*=============================================================================
#filename:h264encoder.c
#desc:thisprogramaimtogetimagefromusbcamera,
#usedthev4l2interface.
#author:licaibiao
#version:
#lastchange:2017-02-21
=============================================================================*/
#include
#include
#include
#include./include/h264encoder.h
intwidth=640;
intheight=480;
voidcompress_begin(encoder*en,intwidth,intheight){
en->param=(x264_param_t*)malloc(sizeof(x264_param_t));
en->picture=(x264_picture_t*)malloc(sizeof(x264_picture_t));
x264_param_default(en->param);//setdefaultparam
//en->param->rc.i_rc_method=x264_rc_cqp;
//en->param->i_log_level=x264_log_none;
en->param->i_threads=x264_sync_lookahead_auto;
en->param->i_width=width;//setframewidth
en->param->i_height=height;//setframeheight
width=width;
height=height;
//en->param->i_frame_total=0;
//en->param->i_keyint_max=10;
en->param->rc.i_lookahead=0;
//en->param->i_bframe=5;
//en->param->b_open_gop=0;
//en->param->i_bframe_pyramid=0;
//en->param->i_bframe_adaptive=x264_b_adapt_trellis;
//en->param->rc.i_bitrate=1024*10;//rate10kbps
en->param->i_fps_num=30;
en->param->i_fps_den=1;
en->param->i_csp=x264_csp_i422;
x264_param_apply_profile(en->param,x264_profile_names[4]);
if((en->handle=x264_encoder_open(en->param))==0){
return;
}
/*createanewpic*/
x264_picture_alloc(en->picture,x264_csp_i422,en->param->i_width,
en->param->i_height);
}
intcompress_frame(encoder*en,inttype,uint8_t*in,uint8_t*out){
x264_picture_tpic_out;
intindex_y,index_u,index_v;
intnum;
intnnal=-1;
intresult=0;
inti=0;
staticlongintpts=0;
uint8_t*p_out=out;
charchar*y=en->picture->img.plane[0];
charchar*u=en->picture->img.plane[1];
charchar*v=en->picture->img.plane[2];
charchar*ptr;
index_y=0;
index_u=0;
index_v=0;
num=width*height*2-4;
for(i=0;i
i_type=x264_type_p;
break;
case1:
en->picture->i_type=x264_type_idr;
break;
case2:
en->picture->i_type=x264_type_i;
break;
default:
en->picture->i_type=x264_type_auto;
break;
}
en->picture->i_pts=pts++;
if(x264_encoder_encode(en->handle,&(en->nal),&nnal,en->picture,
&pic_out)<0){
return-1;
}
for(i=0;inal[i].p_payload,en->nal[i].i_payload);
p_out+=en->nal[i].i_payload;
result+=en->nal[i].i_payload;
}
returnresult;
}
voidcompress_end(encoder*en){
if(en->handle){
x264_encoder_close(en->handle);
}
if(en->picture){
x264_picture_clean(en->picture);
free(en->picture);
en->picture=0;
}
if(en->param){
free(en->param);
en->param=0;
}
}
上面的代码是配置x264编码器的,有下面几个地方需要特别注意:
(1)csp参数的配置
[objc]view plain
en->param->i_csp=x264_csp_i422;
在x264中默认的i_csp值是3,也就是x264_csp_nv12 的值,如果采用yuyv(422)输入格式,这个值一定需要重新设置,不然会出现错误提示:x264 [error]: invalid input colorspace 。这是因为在x264内核中他会把输入格式装换为下面三种中的一种:x264_csp_nv12,x264_csp_nv16,x264_csp_i444.转换如下:
[objc]view plain
staticintx264_frame_internal_csp(intexternal_csp)
{
switch(external_csp&x264_csp_mask)
{
casex264_csp_nv12:
casex264_csp_nv21:
casex264_csp_i420:
casex264_csp_yv12:
returnx264_csp_nv12;
casex264_csp_nv16:
casex264_csp_i422:
casex264_csp_yv16:
casex264_csp_v210:
returnx264_csp_nv16;
casex264_csp_i444:
casex264_csp_yv24:
casex264_csp_bgr:
casex264_csp_bgra:
casex264_csp_rgb:
returnx264_csp_i444;
default:
returnx264_csp_none;
}
}
(2)profile类型设置
[objc]view plain
x264_param_apply_profile(en->param,x264_profile_names[4]);
在yuv422中,它不支持baseline,默认设置会提示:x264 [error]: baseline profile doesn't support 4:2:2 可以设置下面的其他参数:
[objc]view plain
x264_profile_names[]={baseline,main,high,high10,high422,high444,0};
(3)图片内存分配
[objc]view plain
x264_picture_alloc(en->picture,x264_csp_i422,en->param->i_width,
en->param->i_height);
这里的第二个参数一定要与你的输入格式先对应,不然的话会出现内存溢出的错误。因为默认的分配图片内存大小是yuv420的。以640*480 分辨率来举例,yuv420 分配一帧图像的内存是450k,而我们yuv422的数据量是600k。
(4)y,u,v 数据需要分离
[objc]view plain
for(i=0;ii_pts=pts++;
i_pts = pts的参数是需要递增的,不让回出现警告:x264 [warning]: non-strictly-monotonic pts
完整的编译运行结果如下:
[objc]view plain
[root@redhattest]#ls
h264encoder.cincludelibmain.cmakefileout
[root@redhattest]#make
gcc-g-c-omain.omain.c
gcc-g-c-oh264encoder.oh264encoder.c
gcc-g-ox264_testmain.oh264encoder.o-lpthread-lx264-lm
[root@redhattest]#ls
h264encoder.ch264encoder.oincludelibmain.cmain.omakefileoutx264_test
[root@redhattest]#./x264_test
cameradrivernameis:uvcvideo
cameradevicenameis:uvccamera(046d:0825)
camerabusinformation:usb-0000:00:1a.0-1.1
n_buffer=4
x264[warning]:lookaheadlessmb-treerequiresintrarefreshorinfinitekeyint
x264[info]:usingcpucapabilities:mmx2sse2fastssse3sse4.2avx
x264[info]:profilehigh4:2:2,level3.0,4:2:28-bit
spendtime85.082031s
x264[info]:framei:8avgqp:20.27size:21592
x264[info]:framep:503avgqp:21.18size:3119
x264[info]:frameb:1485avgqp:22.03size:952
x264[info]:consecutiveb-frames:0.8%0.0%0.0%99.2%
x264[info]:mbii16..4:11.9%55.2%32.9%
x264[info]:mbpi16..4:0.4%0.2%0.1%p16..4:44.8%7.9%8.5%0.0%0.0%skip:38.2%
x264[info]:mbbi16..4:0.0%0.0%0.0%b16..8:25.9%0.6%0.1%direct:1.7%skip:71.7%l0:51.6%l1:47.0%bi:1.4%
x264[info]:8x8transformintra:46.7%inter:95.7%
x264[info]:codedy,uvdc,uvacintra:60.5%87.6%59.7%inter:5.7%23.2%0.9%
x264[info]:i16v,h,dc,p:4%8%1%87%
x264[info]:i8v,h,dc,ddl,ddr,vr,hd,vl,hu:16%39%12%3%5%4%10%4%7%
x264[info]:i4v,h,dc,ddl,ddr,vr,hd,vl,hu:24%41%8%3%4%3%8%3%4%
x264[info]:i8cdc,h,v,p:50%22%21%6%
x264[info]:weightedp-frames:y:0.2%uv:0.0%
x264[info]:refpl0:40.2%4.8%39.3%15.7%
x264[info]:refbl0:65.6%20.4%14.0%
x264[info]:refbl1:91.2%8.8%
x264[info]:kb/s:379.47
[root@redhattest]#
这里设置的分辨率是640*480 ,这样采集数据比较快。我编码2000帧数据需要的是大约85s,帧率大约在23fps 。也不知道具体是什么原因导致耗时这么长时间。
视频运行如下:
安森美半导体推出新的高速3:1 USB移动高清连接(MHLTM)开关
惠普轻薄本ENVY 17的配置公布,采用英特尔AX 201网卡
介绍一种坚韧的滑环固体聚合物电解质
安博会如安防行业的一面镜子,反映着安防发展的脉搏
华为手机发货量即将超过2亿台这样巨大的年发货量是如何做到的
V4L2采集—X264编码H264视频实例
怎么获得比特币 6种方式看完秒懂
小米8与荣耀10GT哪个性价比最高
利用温度至比特转换器解决温度测量准确度的挑战
芯片制作对设备性能的需求NAURA如何布局
经历了什么?小米合伙人潘九堂狠批小米营销水平差
纳米线-透明手机技术重大突破
基于i.MX6的工业物联智能终端解决方案
如何将以太网交换芯片上的P4可编程性技术引入以太网控制器?
常见电机控制方面的实物接线图
首届LabVIEW国际挑战赛火热启动,冠军直通美国德州NIWeek
节省35% MCU开发成本的红外智能洗手器运用方案,N9300-S46音乐芯片
Ross Video为Abekas Tria制作服务器产品线推出最新产品Tria+ UHD
静态路由配置举例
11月半导体领域重要融资事件汇总