資源簡介
Linux下通過v4l2技術(shù)采集USB攝像頭的視頻,然后通過x264編碼器編碼成視頻儲存起來

代碼片段和文件信息
#include?“cam.h“
#include?“x264_encode.h“
#include?“net.h“
int?usTimer(long?us)
{
????struct?timeval?timeout;
????timeout.tv_sec?=?0;
????timeout.tv_usec?=?us;
????return?select(0NULLNULLNULL&timeout);
}
int?yuyv_to_yuv420p(const?unsigned?char?*in?unsigned?char?*out?unsigned?int?width?unsigned?int?height)
{
????
????unsigned?char?*y?=?out;
????unsigned?char?*u?=?out?+?width*height;
????unsigned?char?*v?=?out?+?width*height?+?width*height/4;
????unsigned?int?ij;
????unsigned?int?base_h;
????unsigned?int?is_y?=?1?is_u?=?1;
????unsigned?int?y_index?=?0?u_index?=?0?v_index?=?0;
????unsigned?long?yuv422_length?=?2?*?width?*?height;
????//序列為YU?YV?YU?YV,一個yuv422幀的長度?width?*?height?*?2?個字節(jié)
????//丟棄偶數(shù)行?u?v
????for(i=0;?i ????{
????????*(y+y_index)?=?*(in+i);
????????y_index++;
????}
????for(i=0;?i ????{
????????base_h?=?i*width*2;
????????for(j=base_h+1;?jse_h+width*2;?j+=2)
????????{
????????????if(is_u){
????????????????*(u+u_index)?=?*(in+j);
????????????????u_index++;
????????????????is_u?=?0;
????????????}
????????????else{
????????????????*(v+v_index)?=?*(in+j);
????????????????v_index++;
????????????????is_u?=?1;
????????????}
????????}
????}
????return?1;
}
int?open_cam()
{
????struct?v4l2_capability?cap;
????cam_fd?=?open(DEV_NAME?O_RDWR?|?O_NONBLOCK?0);??//非阻塞方式打開攝像頭
????if?(cam_fd?0)
????{
????????perror(“open?device?failed!“);
????????return?-1;
????}
????/*獲取攝像頭信息*/
????if?(ioctl(cam_fd?VIDIOC_QUERYCAP?&cap)?0)
????{
????????perror(“get?info?failed!“);
????????return?-1;
????}
????printf(“Driver?Name:%s\n?Card?Name:%s\n?Bus?info:%s\n?version:%d\n?capabilities:%x\n?\n?“?cap.driver?cap.card?cap.bus_infocap.versioncap.capabilities);
?????????????
????if?((cap.capabilities?&?V4L2_CAP_VIDEO_CAPTURE)?==?V4L2_CAP_VIDEO_CAPTURE)
????{
????????printf(“Device?%s:?supports?capture.\n“DEV_NAME);
????}
????if?((cap.capabilities?&?V4L2_CAP_STREAMING)?==?V4L2_CAP_STREAMING)
????{
????????printf(“Device?%s:?supports?streaming.\n“DEV_NAME);
????}
????return?0;
}
int?set_cap_frame()
{
????struct?v4l2_format?fmt;
????/*設(shè)置攝像頭捕捉幀格式及分辨率*/
????fmt.type?=?V4L2_BUF_TYPE_VIDEO_CAPTURE;
????fmt.fmt.pix.width?=?WIDTH;???
????fmt.fmt.pix.height?=?HEIGHT;
????fmt.fmt.pix.field?=?V4L2_FIELD_INTERLACED;
????fmt.fmt.pix.pixelformat?=?V4L2_PIX_FMT_YUYV;???//圖像存儲格式設(shè)為YUYV(YUV422)
????if?(ioctl(cam_fd?VIDIOC_S_FMT?&fmt)?0)
????{
????????perror(“set?fmt?failed!“);
????????return?-1;
????}
????printf(“fmt.type:%d\n“fmt.type);
????printf(“pix.pixelformat:%c%c%c%c\n“?\
????????????fmt.fmt.pix.pixelformat?&?0xFF\
????????????(fmt.fmt.pix.pixelformat?>>?8)?&?0xFF?\
????????????(fmt.fmt.pix.pixelformat?>>?16)?&?0xFF\
????????????(fmt.fmt.pix.pixelformat?>>?24)?&?0xFF);
????printf(“pix.width:%d\n“fmt.fmt.pix.width);
????printf(“pix.height:%d\n“fmt.fmt.pix.height);
????printf(“pix.fiel
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2019-03-26?14:04??v4l2_h264\
?????目錄???????????0??2019-03-26?14:04??v4l2_h264\UVC_record_ubuntu\
?????目錄???????????0??2019-03-26?14:04??v4l2_h264\UVC_record_ubuntu\UVC_record\
?????目錄???????????0??2019-03-26?14:04??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_1\
?????文件?????????297??2016-07-27?14:20??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_1\Makefile
?????文件???????34536??2016-07-27?11:17??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_1\avilib.c
?????文件????????6258??2016-07-27?11:17??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_1\avilib.h
?????文件???????50552??2016-07-27?14:24??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_1\avilib.o
?????文件???????69072??2016-07-27?14:24??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_1\camera_MJPEG
?????文件????????2349??2016-07-27?14:13??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_1\main.c
?????文件???????19848??2016-07-27?14:24??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_1\main.o
?????文件????????8844??2016-07-27?12:06??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_1\video_capture.c
?????文件????????1357??2016-07-27?11:18??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_1\video_capture.h
?????文件???????30080??2016-07-27?14:24??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_1\video_capture.o
?????目錄???????????0??2019-03-26?14:04??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\
?????文件?????????350??2016-07-27?18:00??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\Makefile
?????文件???????34536??2016-07-27?11:17??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\avilib.c
?????文件????????6258??2016-07-27?11:17??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\avilib.h
?????文件????????4012??2015-11-17?15:01??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\color.c
?????文件????????2902??2015-11-17?15:01??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\color.h
?????文件?????????308??2016-07-27?14:59??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\for_MJPEG
?????文件????????3644??2016-07-27?17:24??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\h264encoder.c
?????文件?????????573??2016-07-26?15:31??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\h264encoder.h
?????文件????????5652??2015-11-17?15:01??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\huffman.h
?????目錄???????????0??2019-03-26?14:04??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\include\
?????文件???????40894??2016-07-26?15:20??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\include\x264.h
?????文件?????????245??2012-04-17?13:43??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\include\x264_config.h
?????目錄???????????0??2019-03-26?14:04??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\lib\
?????文件?????1026684??2012-04-29?15:42??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\lib\libx264.a
?????文件????????1495??2016-07-27?18:24??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\main.c
?????文件???????28788??2016-07-18?18:22??v4l2_h264\UVC_record_ubuntu\UVC_record\uvc_avilib_2\utils.c
............此處省略97個文件信息
- 上一篇:中科大軟件學(xué)院考研復(fù)試
- 下一篇:簡單的struts2增刪改查
評論
共有 條評論