資源簡介
功能簡介:
1.攝像頭通過V4L2采集yuyv格式圖像數據
2.yuyv轉yuv420p格式
3.yuv420p通過x264編碼壓縮為h264碼流
4.將h264碼流通過tcp傳輸到顯示端
5.顯示端接收h264碼流,并保存為本地文件,程序運行結束后可通過VLC播放器直接打開xxxx.h264文件進行播放。

代碼片段和文件信息
#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?個字節
????//丟棄偶數行?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;
????/*設置攝像頭捕捉幀格式及分辨率*/
????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;???//圖像存儲格式設為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??2018-10-29?16:45??cam_x264_v2.0\
?????目錄???????????0??2018-10-29?16:44??cam_x264_v2.0\cam\
?????文件????????6387??2018-10-29?16:35??cam_x264_v2.0\cam\cam.c
?????文件???????19576??2018-10-29?16:35??cam_x264_v2.0\cam\cam.o
?????文件???????41314??2018-10-29?16:35??cam_x264_v2.0\cam\cam_x264
?????目錄???????????0??2018-10-29?16:43??cam_x264_v2.0\cam\include\
?????文件?????????773??2018-10-29?16:33??cam_x264_v2.0\cam\include\cam.h
?????文件?????????290??2018-10-29?10:16??cam_x264_v2.0\cam\include\net.h
?????文件???????46889??2018-10-23?10:41??cam_x264_v2.0\cam\include\x264.h
?????文件?????????172??2018-10-17?10:01??cam_x264_v2.0\cam\include\x264_config.h
?????文件?????????140??2018-10-29?16:15??cam_x264_v2.0\cam\include\x264_encode.h
?????目錄???????????0??2018-10-29?16:43??cam_x264_v2.0\cam\lib\
?????文件?????2375598??2018-10-17?10:00??cam_x264_v2.0\cam\lib\libx264.so
?????文件?????2375598??2018-10-17?10:00??cam_x264_v2.0\cam\lib\libx264.so.157
?????目錄???????????0??2018-10-29?16:43??cam_x264_v2.0\cam\lib\pkgconfig\
?????文件?????????321??2018-10-17?10:00??cam_x264_v2.0\cam\lib\pkgconfig\x264.pc
?????文件????????2125??2018-10-29?16:35??cam_x264_v2.0\cam\main.c
?????文件???????10988??2018-10-29?16:35??cam_x264_v2.0\cam\main.o
?????文件?????????376??2018-10-24?16:24??cam_x264_v2.0\cam\Makefile
?????文件?????????562??2018-10-29?10:07??cam_x264_v2.0\cam\net.c
?????文件????????4828??2018-10-29?16:35??cam_x264_v2.0\cam\net.o
?????文件????????4680??2018-10-29?16:16??cam_x264_v2.0\cam\x264_encode.c
?????文件???????17236??2018-10-29?16:35??cam_x264_v2.0\cam\x264_encode.o
?????目錄???????????0??2018-10-29?16:45??cam_x264_v2.0\cli\
?????文件????????1906??2018-10-29?16:08??cam_x264_v2.0\cli\cli_video.c
?????文件?????????426??2018-10-29?17:14??cam_x264_v2.0\read.txt
評論
共有 條評論