liunx usb摄像头使用 |
您所在的位置:网站首页 › linux操作系统视频 › liunx usb摄像头使用 |
由于无人机项目需要搭载双光摄像头,故学习一下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摄像头使用 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |