• 大小: 2.36MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-08-10
  • 语言: 其他
  • 标签: v4l2  x264  yuv420p  tcp  

资源简介

功能简介: 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

评论

共有 条评论