视频传输

视频传输方式一:以IIC协议,通过IO口传输视频流:

视频传输方式二:以usb接口传输视频流:

驱动:字符设备驱动

怎么写驱动程序:构造file_operations

告诉内核

入口函数

出口函数

v4l2驱动框架:核心层 -- > file_operations

硬件相关层:

1、将usb摄像头设备插到装有虚拟机的pc上,dmesg会打印出一些发现usb摄像头设备的信息,在内核中grep找到打印信息的具体位置;

2、查找打印信息

3、用source insight或其他阅读软件打开uvc_driver.c文件

3.1 -->struct uvc_driver

--> uvc_probe:

v4l2_device_register

uvc_register_chains ---uvc_register_video--video_device  video_register_device

---struct video_device *vdev;

struct uvc_device *dev,

vdev->v4l2_dev = &dev->vdev;
                                                                 vdev->fops = &uvc_fops;

media_device_register

4、在内核中有v4l2-framework.txt文档可以参考

5、可以分析虚拟摄像头驱动:vivi.c

vivi_init-->vivi_create_instance-->video_device_alloc-->video_register_device-->__video_register_device-->vdev->cdev = cdev_alloc();--> cdev_add()

6、在内核中已经提供了file_operations  v4l2_fops  的一些基本函数,所以我们不需要写字符设备函数。当应用层调用ioctl函数时,调用file_operations中的ioctl---.unlocked_ioctl = v4l2_ioctl,

v4l2_ioctl------

if (video_is_registered(vdev))
                      ret = vdev->fops->unlocked_ioctl(filp, cmd, arg);

如果video_device已经被注册了,就调用video_device里面的fops函数里面的unlocked_ioctl函数。

而unlocked_ioctl函数内核中已经写好了,我们不需要再写---video_usercopy

----cmd_input_size(cmd);

----check_array_args(cmd, parg, &array_size, &user_ptr, &kernel_ptr);

----得到我们想要的

static unsigned long cmd_input_size(unsigned int cmd)
{
    /* Size of structure up to and including ‘field‘ */
#define CMDINSIZE(cmd, type, field)                     case VIDIOC_##cmd:                             return offsetof(struct v4l2_##type, field) +                 sizeof(((struct v4l2_##type *)0)->field);

    switch (cmd) {
        CMDINSIZE(ENUM_FMT,        fmtdesc,    type);
        CMDINSIZE(G_FMT,        format,        type);
        CMDINSIZE(QUERYBUF,        buffer,        length);
        CMDINSIZE(G_PARM,        streamparm,    type);
        CMDINSIZE(ENUMSTD,        standard,    index);
        CMDINSIZE(ENUMINPUT,        input,        index);
        CMDINSIZE(G_CTRL,        control,    id);
        CMDINSIZE(G_TUNER,        tuner,        index);
        CMDINSIZE(QUERYCTRL,        queryctrl,    id);
        CMDINSIZE(QUERYMENU,        querymenu,    index);
        CMDINSIZE(ENUMOUTPUT,        output,        index);
        CMDINSIZE(G_MODULATOR,        modulator,    index);
        CMDINSIZE(G_FREQUENCY,        frequency,    tuner);
        CMDINSIZE(CROPCAP,        cropcap,    type);
        CMDINSIZE(G_CROP,        crop,        type);
        CMDINSIZE(ENUMAUDIO,        audio,         index);
        CMDINSIZE(ENUMAUDOUT,        audioout,     index);
        CMDINSIZE(ENCODER_CMD,        encoder_cmd,    flags);
        CMDINSIZE(TRY_ENCODER_CMD,    encoder_cmd,    flags);
        CMDINSIZE(G_SLICED_VBI_CAP,    sliced_vbi_cap,    type);
        CMDINSIZE(ENUM_FRAMESIZES,    frmsizeenum,    pixel_format);
        CMDINSIZE(ENUM_FRAMEINTERVALS,    frmivalenum,    height);
    default:
        return _IOC_SIZE(cmd);
    }
}

static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,
                void * __user *user_ptr, void ***kernel_ptr)
{
    int ret = 0;

    switch (cmd) {
    case VIDIOC_QUERYBUF:
    case VIDIOC_QBUF:
    case VIDIOC_DQBUF: {
        struct v4l2_buffer *buf = parg;

        if (V4L2_TYPE_IS_MULTIPLANAR(buf->type) && buf->length > 0) {
            if (buf->length > VIDEO_MAX_PLANES) {
                ret = -EINVAL;
                break;
            }
            *user_ptr = (void __user *)buf->m.planes;
            *kernel_ptr = (void *)&buf->m.planes;
            *array_size = sizeof(struct v4l2_plane) * buf->length;
            ret = 1;
        }
        break;
    }

    case VIDIOC_S_EXT_CTRLS:
    case VIDIOC_G_EXT_CTRLS:
    case VIDIOC_TRY_EXT_CTRLS: {
        struct v4l2_ext_controls *ctrls = parg;

        if (ctrls->count != 0) {
            if (ctrls->count > V4L2_CID_MAX_CTRLS) {
                ret = -EINVAL;
                break;
            }
            *user_ptr = (void __user *)ctrls->controls;
            *kernel_ptr = (void *)&ctrls->controls;
            *array_size = sizeof(struct v4l2_ext_control)
                    * ctrls->count;
            ret = 1;
        }
        break;
    }
    }

    return ret;
}

7、用strace 可以获得程序执行过程中的系统调用

strace -o xawtv.log xawtv

xawtv所涉及的系统调用就会记录在xawtv.log中

原文地址:https://www.cnblogs.com/zhu-g5may/p/9970364.html

时间: 2024-08-14 05:41:31

视频传输的相关文章

linux下视频传输测试

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 在上一篇<ubuntu下基于qt+OpenCV控制摄像头>的基础上测试了视频传输. 环境:主机:PC + Ubuntu10.04 + OpenCV + Qt 从机:s3c6410 + linux2.6.38 + Qt 主机有摄像头,捕捉摄像头,然后通过网络传输,从机接收数据后显示. 实现流程: 主机代码: 主要代码如下,socket编程采用Linux本身提供的方法. widget.h [html] 

基于RTP的h.264视频传输系统设计(一)

一.H.264 的层次介绍 H.264 定义三个层次,每个层次支持一组特定的编码功能,并且依照各个层次指定所指定的功能.基础层次(baselineprofile)支持I 帧和 P 帧[1]的帧内和帧间编码,支持自适应的可变长度的熵编码(CAVLC).主要层次(main profile)支持隔行扫描视频,B帧[2]的帧内编码,使用加权预测的帧内编码和使用上下文的算术编码(CABAV).扩展层次(extendedprofile)不支持隔行扫描视频和CABAC,但增加了码流之间高效的转化模式(SP 和

如果要做点对点的视频传输应该一般使用什么协议

如果要做点对点的视频传输应该一般使用什么协议 我想在一台电脑上接受另一台电脑的摄像头视频流并显示出来.我现在能够得到摄像头采集的每一帧图像,想要传输给接收端.如果直接传输原始数据的话,640*480的图像每一帧0.9M左右,每秒24帧也要21MB/s的传输速率,显然太大了.我之前没有任何的关于视频传输方面的编程经验,所以完全没有头绪.想请教一下大家应该采取什么样的措施来减少传输的数据量?给个关键字也行.谢谢. 1>视频源fmpeg压缩2>按照一种标准封装传输格式,一般是rfc3984 over

计算机网络——网页上(或其他情况下)的视频传输是基于TCP还是UDP

计算机网络——网页上(或其他情况下)的视频传输是基于TCP还是UDP 1. 综述 链接:百度知道 当然,需要清楚,这里说基于TCP还是UDP是在传输层,应用层的协议估计种类多多. 总结找到的内容,应该说: 1. 网页上的视频是基于HTTP/HTTPS,传输层是TCP 2. QQ视频聊天等是基于UDP 3. 甚至有的应用使用p2p协议,传输层应该也是TCP 4. 通过http进行流化视频有很多种方法 5. 传输视频还有很多其他的应用层协议 一方面,在网页上看视频可以忍受缓冲5s看到更清楚的视频,所

一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(六)RTP音视频传输解析层之音视频数据传输格式

一.差异 本地音视频数据格式和用来传输的音视频数据格式存在些许差异,由于音视频数据流到达客户端时,需要考虑数据流的数据边界.分包.组包顺序等问题,所以传输中的音视频数据往往会多一些字节. 举个例子,有时候一个媒体分包数据量很大(比如H264的一个分包常常会有2-4K),而大多数网络的MTU(最大传输单元)基本都是1500字节. 如果频繁收发这么大的数据包,会额外增添路由器的负担,甚至会导致网络阻塞,不利于网络的稳定. 于是服务器就自行对H264进行了分包以适应MTU,每个分包的开始处往往会多出一

小米路由器mini--OpenWrt刷机/adhoc网络配置/视频传输测试

1.小米路由器配置        1.1开发版刷机 新的小米MINI路由器自带稳定版系统,该系统不能进行刷机,因此需要升级为开发版操作系统. 开发版下载地址:http://miwifi.com/miwifi_download.html (1)准备工作 第一步选择ROM下载,路由器型号为mini.第二步,准备一个U盘,并将其格式化为FAT32格式,而后把下载好的ROM文件.bin重命名为miwifi.com拷入U盘. (2)刷机 路由器断电,插入U盘.按住reset键,上电,当指示灯闪烁时松开re

视频传输接口

一: VGA(Video Graphics Array,视频图形阵列):IBM在1987年随PS/2("Personal System 2"的意思,即"个人系统2",该个人电脑的键盘鼠标采用PS/2接口,并且这种接口被沿用了二十几年)个人电脑的推出而发布的一种视频传输标准,视频数据以模拟信号传输,导致了数字信号->模拟信号->数字信号的转换过程,是一种有损传输. 二: DVI(Digital Visual Interface,数字视频接口):1999年由

奥运转播加速上云,北京冬奥组委测试阿里云视频传输技术

摘要: 10月11日晚,北京冬奥组委与国际奥林匹克转播机构进行了云视频传输技术测试,工作人员通过阿里云传输技术,对布宜诺斯艾利斯青奥会多个项目进行多路电视转播测试,监测了实时传播的画面清晰度.延时等指标,并模拟了整套体育赛事远程视频制作流程. 10月11日晚,北京冬奥组委与国际奥林匹克转播机构进行了云视频传输技术测试,工作人员通过阿里云传输技术,对布宜诺斯艾利斯青奥会多个项目进行多路电视转播测试,监测了实时传播的画面清晰度.延时等指标,并模拟了整套体育赛事远程视频制作流程. 在接受北京电视台采访

【转载】 Jointwave零延时视频传输for FPGA/ASIC进入军工领域

半导体知识产权H.264/H.265 硅IP核供应商Jointwave公司的发布了一系列视频编解码RTL IP核,已经成功应用于军事工业领域的指挥作战,无人机UAV控制,航空和航天摄像机,视频记录黑匣子等应用 这些IP核对应技术特性如下:第一个特性是视频编码器和视频解码器配合工作可实现零延时视频传输系统,也只有实现了零延时才能应用到军事指挥作战和UAV & Avionics控制领域.第二特性是视觉无损,1路高清画面1080P@60FPS无压缩数据量是3Gbps,采用H.264 Intra onl