● 普通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++,这还只是应用层级,嵌入式就更困难了。