● 普通USB摄像头转为网络摄像头

Raspberry Pi Zero W吃灰有一段时间了,想着能否废物利用,使用普通USB摄像头改成一个RTSP协议网络摄像头。

1. 查看摄像头是否可用

查看是否已识别USB摄像头:

lsusb -t

安装luvcview:

sudo apt-get install luvcview

运行luvcview:

luvcview -d /dev/video0 -f yuv -s 640x480
# 这里640x480是根据`lsusb -t`获取的480M
# 如果是320M,则可以输入320x240
# 或者直接运行`luvcview`

2. 方法1:ffserver

2.1 安装H264和ffmpeg

H264:视频压缩算法 ffmpeg:视频转流工具

# 安装H264
cd /usr/src

sudo git clone https://code.videolan.org/videolan/x264.git
cd x264
sudo ./configure --host=arm-unknown-linux-gnueabi --enable-static --disable-opencl
sudo make -j4
sudo make install

# 安装ffmpeg
sudo git clone https://git.videolan.org/git/ffmpeg.git
cd ffmpeg
sudo ./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree
sudo make -j4
sudo make install

上面编译安装在我的Raspberry Pi Zero W上安装非常慢,5个多小时还没编译完。树莓派zero实在太慢,我找了台公司闲置的低配电脑装了ubuntu 16.04,插上了usb摄像头进行测试。建议使用下面的命令直接安装:

sudo apt install ffmpeg libx264-dev

电脑配置如下:

2.2 修改配置文件:

sudo gedit /etc/ffserver.conf

增加或修改以下内容:

HTTPPort 8090                                 #绑定端口号
HTTPBindAddress 0.0.0.0                       #绑定IP
MaxHTTPConnections 2000                       #最大HTTP连接数
MaxClients 1000                               #最大客户端连接数
MaxBandwidth 1000                             #最大带宽
CustomLog -                                   #日志文件,- 为直接打印
 
<Feed feed1.ffm>                              #feed:每一个输入都建立一个feed
File /tmp/feed1.ffm                           #feed缓存文件位置和名称
FileMaxSize 50M                               #缓存文件最大值
ACL allow 127.0.0.1                           #允许写入feed的IP
ACL allow 192.168.0.0 192.168.255.255         #允许写入feed的IP范围
</Feed>
 
RTSPPort 8554                                 #rtsp端口号
RTSPBindAddress 0.0.0.0                       #rtsp IP地址
<Stream live1.h264>                           #
Format rtp                                    #视频流的格式
Feed feed1.ffm                                #视频流的种子来源
VideoCodec libx264                            #
VideoFrameRate 24                             #视频帧率
VideoBitRate 128                              #视频比特率
VideoBufferSize 100                           #视频缓冲区大小
VideoSize 640x480                             #视频帧大小
VideoQMin 1                                   #
VideoQMax 31                                  #
NoAudio                                       #无音频
AVOptionVideo flags +global_header
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
Auth USERNAME:PASSWORD                        #身份验证信息
</Stream>

2.3 启动ffserver服务:

ffserver

2.4 转发rtsp流:

ffmpeg -f v4l2 -i /dev/video0 -s 640x480 -r 24 -vcodec libx264 -an http://127.0.0.1:8090/feed1.ffm

2.5 本机安装vlc图形应用:

sudo snap install vlc --devmode

2.6 vlc查看rtsp流视频

rtsp://127.0.0.1:8554/live1.h264

摄像头为普通免驱USB广角摄像头:

rtsp视频流播放界面,大约有5秒左右延迟:

这样一个普通摄像头已经被改造成RTSP协议的网络摄像头。

参考资料: https://ffmpeg.org/ffmpeg.html https://www.jianshu.com/p/20d4b81f8d14 https://www.cnblogs.com/chay/p/10553787.html

方法2:GStreamer

2.1 采集USB摄像头视频源,并RTSP推流

先安装编译gstreamer rtsp需要用到的工具:

sudo apt-get install libx264-dev gtk-doc-tools

sudo apt-get install libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-ugly
# 注意:安装部分包时可能提示需要降级,会造成系统异常。推荐一个包管理工具:aptitude。

再下载gstreamer rtsp源码(注意:下载gstreamer rtsp源码的时候必须选择1.8分支的版本,否则在进行编译的时候会报错:Dependency gstreamer-1.0 found: No found 1.14.5 but need: ‘>= 1.19.0’):

sudo apt install git
git clone -b 1.8 https://github.com/GStreamer/gst-rtsp-server.git 

接着编译gstreamer rtsp源码:

cd gst-rtsp-server 
./autogen.sh
sudo make

然后输入rtsp推流命令:

cd examples
./test-launch --gst-debug-level=3 "( v4l2src device=/dev/video0 ! videoconvert ! video/x-raw, format=(string)NV12, width=640, height=480, framerate=30/1 ! queue ! x264enc bitrate=10240 !  rtph264pay name=pay0 pt=96 )"

出现stream ready at rtsp://127.0.0.1:8554/test表示已成功推流。因为机器配置很低,再加上软编码处理,延迟大约4秒。

git克隆下来的c语言源码,我看到了test-auth.c,用于RTSP协议增加身份认证:

参考资料: https://samwhelp.github.io/note-ubuntu-18.04/read/howto/install-tool/gstreamer/ https://www.codeleading.com/article/9016320201/ https://blog.csdn.net/han2529386161/article/details/102724856 https://www.cnblogs.com/kanite/p/10743085.html http://www.javashuo.com/article/p-ekowmyzz-v.html https://blog.csdn.net/pengyouhai/article/details/122595062 https://www.itread01.com/content/1549835115.html

3. 方法3:VLC转流

sudo snap install vlc --devmode

vlc -vvv v4l2:///dev/video0 --sout '#transcode{vcodec=h264,vb=800,acodec=mp4a}:rtp{sdp=rtsp://:8554/live.ts}' --sout-rtsp-user USERNAME --sout-rtsp-pwd PASSWORD -I dummy

# v4l2:// - Video4Linux is the interface to webcams on Linux
# /dev/video1 - device number assigned to webcam by Linux
# vcodec=h264 video codec
# vb=800 - 800 kb/s video bit rate
# acodec=mp4a
# sdp=rtsp://:8554/ - URL/port advertised by RTSP

图像延迟大约5秒左右:

参考资料: https://www.cnblogs.com/chay/p/10553787.html https://superuser.com/questions/1298030/vlc-as-rtsp-server-authentication-not-working

4. 方法4:Live555流媒体服务器

4.1 安装live555

官网下载安装,或者wget:

sudo apt-get install libssl-dev

wget  http://www.live555.com/liveMedia/public/live555-latest.tar.gz
tar -xzvf live555-latest.tar.gz
sudo chmod -R 777 live
cd live
./genMakefiles linux-gdb
make

4.1.1 运行live555MediaServer

./live555MediaServer

4.1.2 用ffmpeg将摄像头的H264流推到管道文件

ffmpeg -f v4l2 -i /dev/video0 -c libx264 ~/live/mediaServer/cam1.264

vlc打开rtsp://127.0.0.1:8000/cam1.264显示,延迟大约8秒,画面如下:

严重不推荐使用这种方式。因为如果重新用vlc打开rtsp,会播放ffmpeg录制到cam1.264的历史视频,而不是实时画面。

4.2 搭建v4l2rtspserver

git clone https://github.com/mpromonet/v4l2rtspserver.git

cd v4l2rtspserver
cmake .
sudo make install

v4l2rtspserver -W 640 -H 480 -F 15 -P 8554 /dev/video0

执行后界面如下(花屏,未成功,应该是编码问题):

4.3 搭建h264_v4l2_rtspserver

git clone https://github.com/lorlor/h264_v4l2_rtspserver

make

./h264_v4l2_rtspserver

程序运行不起来,失败。如下所示:

翻看c++源码,发现报错的地方。不会c++,所以搞不懂为什么前面赋值了,后面还不等于。

参考资料: https://www.g7smy.co.uk/2021/07/setup-a-network-camera-with-a-raspberry-pi/ https://www.likecs.com/show-204098027.html https://www.cuplayer.com/player/PlayerCode/RTSP/2015/0505/1915.html https://www.cnblogs.com/chaingank/p/4702554.html https://blog.csdn.net/zong596568821xp/article/details/88540455 https://download.csdn.net/download/lk8916/10554375 https://www.gushiciku.cn/pl/gfsg/zh-tw https://programmerall.com/article/14041445869/ https://www.its304.com/article/weixin_30483013/98495322 https://sudonull.com/post/14506-Broadcast-h264-video-without-transcoding-from-the-Logitech-C920

总结

看到上面的参考资料就知道我踩了多少坑,零基础入门视频解码真的非常困难,太底层了,基本都是c/c++,这还只是应用层级,嵌入式就更困难了。