liunx usb摄像头使用

您所在的位置:网站首页 linux操作系统视频 liunx usb摄像头使用

liunx usb摄像头使用

2024-07-15 19:18:04| 来源: 网络整理| 查看: 265

由于无人机项目需要搭载双光摄像头,故学习一下linux下摄像头的使用。

一、准备

首先要看自己手上的摄像头在linux下是否免驱,也就是看其是不是UVC设备。UVC是USB Video Class的简写, UVC设备可以直接使用linux提供的USB Video Class Linux device driver。UVC再往下一层是V4L2,Video for Liunx,它是Linux下的视频采集框架,V4L2不仅支持USB摄像头,还能支持其他的视频输入,例如HDMI等。首先用 lsusb 命令找到device ID,得到形如32e4:0415这样的VID:PID,然后 lsusb -d VID:PID -v | grep "14 Video"  得到这样的输出则说明是UVC摄像头。

bFunctionClass         14 Video bInterfaceClass         14 Video

或者使用 ls /dev/video* 输出/dev/video0之类的信息也说明是免驱的。

如果发现不是UVC设备,就只能找厂商要驱动程序源码或者SDK了。

对于UVC设备,我们可以用许多方法获取其视频。首先测试一下设备有没有正常工作,可以使用ubuntu自带的软件cheese(茄子)打开摄像头看一下画面。这里只要有显示就行,我之前一直纠结于cheese显示的画面分辨率低,帧率也低,想把它调好,其实没必要。有的摄像头可以工作在多种模式,cheese只会使用其中一种默认设置,我们是调不了的。

说到这里,我们可以安装v4l-utils工具,查看一下摄像头的基本参数,如果你的摄像头支持多种模式(例如不同的分辨率,不同的pixel format,不同的帧率),这里都会显示出来。

# 安装v4l-utils sudo apt install v4l-utils # 查看摄像头支持的视频参数 sudo v4l2-ctl --all --list-formats-ext # 查看摄像头所有参数 sudo v4l2-ctl -d /dev/video0 --all

这里我的输出是这样

Index       : 0     Type        : Video Capture     Pixel Format: 'MJPG' (compressed)     Name        : Motion-JPEG         Size: Discrete 3840x2160             Interval: Discrete 0.033s (30.000 fps)             Interval: Discrete 0.040s (25.000 fps)             Interval: Discrete 0.050s (20.000 fps)             Interval: Discrete 0.067s (15.000 fps)             Interval: Discrete 0.100s (10.000 fps)             Interval: Discrete 0.200s (5.000 fps)

………………(此处省略index 0的其他分辨率)………………

Index       : 1     Type        : Video Capture     Pixel Format: 'YUYV'     Name        : YUYV 4:2:2         Size: Discrete 3840x2160             Interval: Discrete 1.000s (1.000 fps)         Size: Discrete 2592x1944             Interval: Discrete 1.000s (1.000 fps)         Size: Discrete 2048x1536             Interval: Discrete 0.333s (3.000 fps)         Size: Discrete 1600x1200             Interval: Discrete 0.200s (5.000 fps)

……………………………………………………………………

由于一开始没仔细看这里的信息,导致我走了很多弯路。

这样的输出说明我的摄像头有两种输出形式,一种是MJPG,另一种是YUYV 422,也就是说后面用工具获取视频流的时候是需要指定用哪种数据的。刚才我也提到,我直接用cheese打开摄像头,得到的画面特别卡,后面才想到其实是进入了YUYV 422,3840x2160,1FPS的默认模式。

二、用ffmpeg获取视频

ffmpeg是一种多媒体框架,可以编码、解码各种格式的视频,音频。我们可以用命令行的方式简单地调用ffmpeg工具进行验证。

# 安装ffmpeg sudo apt-get install ffmpeg # ffmpeg视频采集 ffmpeg -f v4l2 -s 1920x1080 -r 30 -vcodec mjpeg -i /dev/video0 -b:v 8000k -an videocap.avi # 更多参数 ffmpeg -f v4l2 -s 1920x1080 -r 30 -vcodec mjpeg -i /dev/video0 -pix_fmt yuv420p -b:v 2000k -vcodec libx264 -preset veryfast -an videocap1.mp4

参数解释 -f 输出格式 -s 分辨率 -r 帧率 -vcodec 编码方式 -i 数据输入流 -b:v 视频码率 默认1000k -an 不处理音频 最后加上输出文件名

-pix_fmt 像素格式,可选yuv420p,yuvj422p,mjpeg等 -b:a 是音频码率 这里我们没有音频 -vcodec libx264 转为H264编码 -preset 处理模式  用时间换质量,可选ultrafast, superfast, veryfast, faster, fast, medium等等

这里主要需要考虑的参数是,-b:v 视频码率,它和分辨率有关,分辨率高而码率过低,视频质量也会很差,分辨率1920x1080的话码率至少要8000k,蓝光是20000k

三、用gstreamer获取视频

gstreamer也是一个多媒体框架,也是自带各种多媒体编解码模块。gstreamer的每个模块相对比较独立,就像一个工具箱里有各种零件,针对不同任务要拿不同的零件拼起来。但是感觉对初学者比较不友好,刚上手的时候既不知道一个完整的管线应该包含那些零件,也不知道工具箱提供了哪些零件,叫什么名字。网上没法直接查到的时候就只能去啃gstreamer插件文档。gst的两个命令行工具是gst-launch和gst-inspect,前者和ffmpeg一样执行命令,后者是一个帮助手册。

在gstreamer官方文档里找到安装方法,这里需注意如果你ubuntu里装了anaconda,anaconda的虚拟环境里又已经存在gstreamer,则有可能会出现冲突。详见gstreamer 无组件问题修复

# 安装gstreamer sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio # 用最简单的命令测试摄像头 gst-launch-1.0 v4l2src ! autovideosink

这里能打开画面即为成功,和cheese显示的画面一样,这里用的是默认参数。对我的摄像头来说也就是YUYV422,3840x2160,1fps。

我们可以通过构建管线,控制程序读YUYV数据或者MJPG数据。

# 使用YUYV格式视频流 gst-launch-1.0 v4l2src ! video/x-raw,format=YUY2,width=800,height=600,framerate=15/1 ! videorate ! videoscale ! videoconvert ! xvimagesink # 使用MJPG格式视频流 gst-launch-1.0 v4l2src device=/dev/video0 ! image/jpeg,width=1920,hight=1080,videorate=30/1 ! jpegdec ! xvimagesink # 分辨率、帧率必须选择摄像头支持的参数,前面也提到了,用此命令查询 sudo v4l2-ctl --all --list-formats-ext

这里我探索很久才成功打开MJPG格式的视频流,主要就是因为一开始没有认真看 sudo v4l2-ctl --all --list-formats-ext 输出的结果,先是没意识到摄像头有两个数据通道,一直在用YUYV那个通道,还纳闷怎么取不到3840x2160  30fps,以为被商家骗了。后来意识到了应该用第二个通道,又把mjpg看成了mpeg,一直在gstreamer文档里面查找mpeg相关插件。

学艺不精,居然把mjpg和mpeg搞混。这里记录一下mjpg和mpeg的区别,mjpg是指这个视频流中每一帧都被压缩成jpeg格式,相邻帧之间是独立压缩的,对这个视频流解码的时候自然是要找jpeg解码器,进行逐帧解码。而mpeg是一个视频有损压缩编码标准,在压缩时是考虑了时间冗余的,也就是单位时间内完整保存第一帧信息,然后就只存储其余帧相对第一帧发生变化的部分。mpeg-4标准是我们现在常用的视频有损压缩编码标准,但mpeg-4和.mp4文件并没有严格的对应关系。虽然.mp4文件格式规范一开始是为mpeg-4设计的,但由于它过于好用,所以后来出现各种扩展,不仅mpeg-4,h.264、h.263的视频轨也可以往.mp4文件里存。

参考:Linux USB摄像头使用



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭