UVC网络摄像头(一)

概述

最近学linux,然后自己做了个小项目,主要功能是将摄像头的数据传给手机,手机实时查看,功能比较low。

原理主要是摄像头将采集的视频数据传输给树莓派,然后树莓派将数据转换压缩后再通过udp协议将压缩后的数据发送给android手机,手机将数据解压然后播放。


流程图中过程比较简单,左边是通过摄像头将数据传给树莓派,然后树莓派将数据通过UDP发送给手机,通过手机自己写的APP显示视频。UDP有时有丢包,图像偶尔有卡帧的现象,但是不算严重,还可以接受,视频大概有几秒钟的延时。本方案还可以更加优化,将X264换成FFmpeg,虽然还是真正编码还是通过X264或X265等,但是可以直接调用RTP,也可以音频编码等,扩展起来更容易。UDP也可以使用RTP,来增加些防丢包的措施,使得效果更好一些,具体的还可以扩展到外网访问。

介绍

因为博主是从零开始的,所以介绍的内容比较简单,废话比较多,很多东西都是自己的理解,有些地方有问题,希望能指出来。
使用的摄像头是UVC摄像头,所以使用V4L2进行读取,读取到的数据是YUY2的数据,具体读取到的数据是什么制式的看摄像头的硬件设计,每个摄像头不一样,但现在大部分的摄像头都是输出YUV422的,但是编码器X264不支持YUV422的输入,所以需要先把YUV422变成YUV420,因为YUV420才能被X264正确编码,FFmpeg我也看了研究了两个礼拜,主要是看官网的文档和雷霄骅的博客,可惜这位博主英年早逝,最开始一直准备使用FFmpe的,并且以为FFmpeg是个编码器,后来发现H264的编码上还是基于x264的,后来直接使用X264是因为FFmpeg的版本更新了,导致很多原本的函数被弃用了,但是官网上的函数介绍虽然指出了,但是官网例程没改,很多实现过程要看源码,要玩转FFmpeg要花大量的时间,而且更新的比较快,不从事图像、监控方面的工作与研究的话没有太多的必要弄得太清楚了。X264将YUV420数据压缩为H264,具体的H264的结构就不说了,网上很多,然后将H264通过UDP发送出去,UDP可以换成RTP,RTP其实是建立在UDP上的,实质还是用UDP在传输,只是给UDP加了些可靠地包结构,防止了数据少的太多无法解码,出现卡屏花屏的现象,具体介绍网上也很多就不说了。最开始服务端实现的是发送RTP结构报,但是由于博主android玩的不是很好,RTP的客服端的很多机制实现起来比较麻烦,所以就弄得简单了点,把服务器改成了直接发送UDP,手机将接收到UDP数据报拆开分离出每段数据放入到MediaCodec中的解码器里面,然后把解码的数据使用SurfaceView控件播放,这基本上就是大概过程。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,它允许开发者使用JavaScript语言进行服务器端编程。Node.js具有高效、轻量级和事件驱动的特点,适用于构建高性能的网络应用程序。 UVC(USB Video Class)是一种标准化的USB设备类别,用于支持视频设备的通用驱动程序。UVC摄像头是指符合UVC标准的USB摄像头,它可以通过标准的USB接口连接到计算机,并且无需安装额外的驱动程序即可进行使用。 在Node.js中,可以使用第三方模块来实现对UVC摄像头的操作和控制。一个常用的模块是`node-uvc`,它提供了对UVC摄像头的访问和控制功能。通过该模块,你可以获取摄像头的视频流、设置摄像头的参数(如分辨率、帧率等)、控制摄像头的功能(如自动对焦、曝光等)等。 以下是使用`node-uvc`模块进行UVC摄像头操作的示例代码: ```javascript const uvc = require('node-uvc'); // 打开摄像头 uvc.findDevice((err, device) => { if (err) { console.error('Failed to find UVC device:', err); return; } // 打开设备 device.open((err) => { if (err) { console.error('Failed to open UVC device:', err); return; } // 设置摄像头参数 device.setFormat(640, 480, 30, (err) => { if (err) { console.error('Failed to set format:', err); return; } // 开始获取视频流 device.startStream((err, frame) => { if (err) { console.error('Failed to start stream:', err); return; } // 处理视频帧数据 console.log('Received frame:', frame); // 停止获取视频流 device.stopStream(); }); }); }); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值