由于无人机项目需要搭载双光摄像头,故学习一下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摄像头使用

liunx usb摄像头使用相关推荐

  1. FFmpeg实现获取USB摄像头视频流测试代码

    通过USB摄像头(注:windows7/10下使用内置摄像头,linux下接普通的usb摄像头(Logitech))获取视频流用到的模块包括avformat和avdevice.头文件仅include ...

  2. NVIDIA TX2 使用 USB 摄像头

    用了一个很冷门的 USB 摄像头,在 Windows 下会自动安装驱动,本来以为在 Ubuntu 下得手动安,试了 easycam 和 gspca 都失败(太老了).没想到貌似根本不需要安装,TX2 ...

  3. [转载]树莓派新版系统上使用mjpg-streamer获取USB摄像头和树莓派专用摄像头RaspiCamera图像...

    树莓派新版系统上使用mjpg-streamer获取USB摄像头和树莓派专用摄像头RaspiCamera图像 网上有很多关于mjpg-stream移植到树莓派的文章,大部分还是使用的sourceforg ...

  4. 2.7 usb摄像头之usb摄像头描述符打印

    学习目标:参考lsusb源码,打印USB摄像头的设备描述符.配置描述符.接口联合描述符.端点描述符: 一.lsusb命令和源码 使用命令lsusb可以看看设备的id,并执行 # lsusb -v -d ...

  5. NanoPi NEO Air使用十五:使用V4L2驱动USB摄像头

    USB摄像头初识   Linux UVC driver(uvc) 该驱动适用于符合USB视频类(USB Video Class)规范的摄像头设备,它包括V4L2内核设备驱动和用户空间工具补丁.大多数大 ...

  6. (原创)基于ZedBoard的Webcam设计(二):USB摄像头图片采集+QT显示

    在(原创基于ZedBoard的Webcam设计(一):Zedboard上的USB摄像头(V4L2接口)的图片采集中,我们完成了ZedBoard上USB摄像头的单幅图片采集,采集到的图片是存储在文件系统 ...

  7. 31全志r58平台Android4.4.2下打开USB摄像头

    31全志r58平台Android4.4.2下打开USB摄像头 2018/10/26 16:00 版本:V1.0 开发板:SC5806 1.系统编译:(略) 2.需要修改的文件: W:\r58_andr ...

  8. linux下uvc协议访问usb摄像头,Ubuntu调用USB摄像头

    FreeBSD Webcam:传送门 1 查看摄像头USB驱动 CMD ls /dev/v* Result /dev/vcs /dev/vcs4 /dev/vcsa1 /dev/vcsa5 /dev/ ...

  9. 如何将usb摄像头连接到虚拟机vmware ubuntu系统上?

    先插上usb摄像头,打开虚拟机 右下角有个圈圈小按钮,点击它,点击连接(断开与主机的连接) 摄像头就会与windows断开,而连接到ubuntu系统上 连上后,就显示成这样 再点击它,能实现断开操作

最新文章

  1. Tensorflow多线程输入数据处理框架(一)——队列与多线程
  2. 点击了SAP CRM HANA report超链接,背后都发生了什么
  3. 【动态规划】数字金字塔
  4. Struts2请求处理的内部流程说明(版本一)
  5. mysql集群fuzhi_MySQL集群 和MySQL主从复制的不同
  6. java 数字组合_java解决数字组合问题
  7. SAP License:关联方跨公司交易的自动清帐与实现
  8. Qt 信号-槽的同步与异步处理
  9. 【风电功率预测】基于matlab粒子群算法优化BP神经网络风电功率预测【含Matlab源码 347期】
  10. c 语言车牌识别系统课题设计,基于图像的车牌识别系统的设计和实现
  11. erphpdown9.64插件加Modown1.9模板主题下载
  12. 基于米思齐的电磁炮基础代码
  13. 在线License管理系统(支持离线授权)
  14. 训练误差和泛化误差、K折交叉验证
  15. Linux#使用ll命令
  16. R 18切割替换练习
  17. windows live messenger 80072eff
  18. vim、用户管理、所有者所属组管理、监控和管理进程、服务管理
  19. dscuzX2.5 数据字典
  20. 大佬给总结的单片机看门狗详解很有用

热门文章

  1. 2020东北大学计算机考研科目,2020东北大学计算机考研初试科目、参考书目、招生人数汇总...
  2. python 超大json文件读取
  3. php自我介绍50字,自我介绍作文50字
  4. JSJ—编译器与虚拟机哪个重要?
  5. java自定义高效map转json逻辑实现
  6. Python练习题:1 用Python判断闰年
  7. 【Java练习题】Java 程序的输出 | 第十三套(集合)
  8. cannot find a java se sdk installed at path_SDK管理器找不到Java
  9. 团队环境搭建:MTK平台,Android 9.0内销TV编译服务器配置
  10. VOACAP 软件的下载与安装