概述

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

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

android uvc视频采集卡 uvc视频采集卡app_linux

流程图中过程比较简单,左边是通过摄像头将数据传给树莓派,然后树莓派将数据通过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控件播放,这基本上就是大概过程。