搭建USB摄像头转RTSP服务器的多种方法

Posted ZONG_XP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搭建USB摄像头转RTSP服务器的多种方法相关的知识,希望对你有一定的参考价值。

1 背景

USB摄像头与网络摄像头相比,可选择范围广、种类多、成本低,但是实际使用时需要通过rtsp流来访问,起到直播的效果,因此在摄像头采集终端上构建rtsp流媒体服务器,将USB摄像头数据转化为rtsp,可以多个客户端访问,在做相关调研时,找到有三种实现方式,分别是ffmpeg(ffserver)、vlc、live555,接下来对这几种方式的实现方法做具体介绍,最后对各种方式的优缺点进行一个比较,读者可根据它们的特点选择合适的服务器,以下服务器搭建的过程均是在ubuntu 16.04上实现的。

2 ffserver

2.1 基本原理

有几个关键概念了解一下

ffserver,负责响应客户端的流媒体请求,把流媒体数据发送给客户端。

ffserver.conf,ffserver启动时的配置文件,在这个文件中主要是对网络协议,缓存文件feed1.ffm和要发送的流媒体文件的格式参数做具体的设定。

feed1.ffm,可以看成是一个流媒体数据的缓存文件,ffserver启动后会自动生成。ffmpeg把转码好的数据发送给ffserver,如果没有客户端连接请求,ffserver把数据缓存到该文件中。

ffmpeg,负责媒体文件的转码工作,把你服务器上的源媒体文件转换成要发送出去的流媒体文件。

关于ffserver的介绍,可参考wiki介绍,如图所示为ffserver的原理

大致流程为:通过ffmpeg将usb摄像头数据推送到ffserver服务器,终端设备通过rtsp地址访问,达到远程访问的效果

2.2 安装方法

很简单,只需要一句指令即可

sudo apt install ffmpeg libx264-dev

2.3 修改配置文件

在终端中打开配置文件

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 10M                               #缓存文件最大值
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                                       #无音频
AVPresetVideo default                          
AVPresetVideo baseline
AVOptionVideo flags +global_header
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>

<Stream stat.html>
Format status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255
</Stream>
<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>

关于ffserver.conf的具体介绍,可参考官方给的配置文件说明,如果有多个USB摄像头,参考feed1的写法,再写一个缓存文件即可

2.4 启动ffserver服务

直接在终端运行

ffserver

2.5 转发rtsp流

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

注意:其中/dev/video1表示USB摄像头对应的名称,要根据自己的设备情况对应更改

2.6 客户端读取

在另外一台终端设备上,如windows的电脑上,用VLC软件,打开网络串流,输入如下rtsp地址,即可打开摄像头

rtsp://192.168.xx.xx:8554/live1.h264

其中,要将上边的IP地址改为服务器的地址

3 vlc

3.1 基本原理

此处用的vlc构建服务器,不是很多博文介绍的,直接在vlc软件中进行设置,而是在命令行中使用命令的方式,这样没必要在服务器端进行显示,只需要在客户端显示即可。

3.2 安装方法

sudo apt-get install vlc

3.3 转流方法

cvlc -vvv v4l2:///dev/video1 --sout '#transcodevcodec=h264,vb=800,acodec=mp4a:rtpsdp=rtsp://:8554/live.ts' -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

3.4 客户端读取

同样的,可在windows电脑上的VLC软件中,输入如下rtsp地址打开摄像头,注意将IP地址改为服务器的地址

rtsp://192.168.xx.xx:8554/live.ts

4 live555

4.1 下载live555

官网下载源码souce code,保存到指定文件夹,解压

tar xvzf live.20xx.tar.gz
sudo chmod -R 777 live
cd live
sudo ./genMakefiles linux-gdb
sudo make

4.2 测试live555

make完之后,会在live/mediaServer下生成live555MediaServer,拷贝一个.264测试视频文件(可将mp4视频后缀直接修改为264,比如test.264)到/live/mediaServer下,然后cd进live/mediaServer目录,启动./live555MediaServer,得到输出如下

nvidia@ubuntu:~/live555/live/mediaServer$ ./live555MediaServer
LIVE555 Media Server
	version 0.96 (LIVE555 Streaming Media library version 2019.03.06).
Play streams from this server using the URL
	rtsp://192.168.170.144:8554/<filename>
where <filename> is a file present in the current directory.
Each file's type is inferred from its name suffix:
	".264" => a H.264 Video Elementary Stream file
	".265" => a H.265 Video Elementary Stream file
	".aac" => an AAC Audio (ADTS format) file
	".ac3" => an AC-3 Audio file
	".amr" => an AMR Audio file
	".dv" => a DV Video file
	".m4e" => a MPEG-4 Video Elementary Stream file
	".mkv" => a Matroska audio+video+(optional)subtitles file
	".mp3" => a MPEG-1 or 2 Audio file
	".mpg" => a MPEG-1 or 2 Program Stream (audio+video) file
	".ogg" or ".ogv" or ".opus" => an Ogg audio and/or video file
	".ts" => a MPEG Transport Stream file
		(a ".tsx" index file - if present - provides server 'trick play' support)
	".vob" => a VOB (MPEG-2 video with AC-3 audio) file
	".wav" => a WAV Audio file
	".webm" => a WebM audio(Vorbis)+video(VP8) file
See http://www.live555.com/mediaServer/ for additional documentation.
(We use port 8000 for optional RTSP-over-HTTP tunneling, or for HTTP live streaming (for indexed Transport Stream files only).)

然后在VLC上打开rtsp流,输入以下地址(注意IP地址修改),即可打开视频,表明安装成功

rtsp://192.168.170.144:8554/test.264

 4.3 转发摄像头数据

该部分内容来源于《使用live555 直播来自v4l2的摄像头数据》,作者也开源了代码,我们直接clone到本地即可

工程里作者把编译好的静态库也一起放进去了,由于每个人运行的平台不一样,所以可能需要进行更改(如果直接make报错的话),文件目录如图所示

├── H264FramedLiveSource.cpp
├── H264VideoStreamer.cpp
├── include
│   ├── encoder
│   │   ├── encoder_define.hh
│   │   ├── H264FramedLiveSource.hh
│   │   └── stdint.h
│   ├── live555
│   │   ├── basicUsageEnvironment
│   │   ├── groupsock
│   │   ├── liveMedia
│   │   └── usageEnvironment
│   └── x264
│       ├── x264_config.h
│       └── x264.h
├── lib
│   ├── livelib
│   │   ├── libBasicUsageEnvironment.a
│   │   ├── libgroupsock.a
│   │   ├── libliveMedia.a
│   │   └── libUsageEnvironment.a
│   └── x264lib
│       ├── libx264.a
│       └── libx264.so.148
└── Makefile

 我们要修改的地方有两个:(1)是在4.1步骤中编译好的库文件中找到livelib下的四个文件,并复制过来覆盖;(2)是查找自己电脑上的libx264.a和libx264.so.148,复制过来覆盖

替换后即可make成功,生成H264VideoStreamer可执行文件,注意在H264FramedLiveSource.cpp文件中,设置的默认设备是/dev/video0,要根据自己的设备实际情况进行修改

生成可执行文件后直接运行,输出内容如下:

nvidia@ubuntu:~/live555/live555_rtsp_live_v4l2-master$ ./H264VideoStreamer 
camera driver name is : uvcvideo
camera device name is : UVC Camera (046d:0823)
camera bus information: usb-3530000.xhci-2.3
n_buffer = 4
x264 [warning]: lookaheadless mb-tree requires intra refresh or infinite keyint
x264 [info]: using cpu capabilities: ARMv8 NEON
x264 [info]: profile High 4:2:2, level 3.0, 4:2:2 8-bit
Play this stream using the URL "rtsp://192.168.170.144:8554/testStream"
Beginning streaming...
Beginning to read from file...

然后根据原作者的描述,在VLC中可打开RTSP码流,我自己输入后没有反应,暂时还不清楚原因,怀疑是平台的问题

  

以上是关于搭建USB摄像头转RTSP服务器的多种方法的主要内容,如果未能解决你的问题,请参考以下文章

EasyRTSPLive摄像机NVR录像机RTSP协议实时流转RTMP协议直播流推送之搭建EasyRTMPLive拉RTSP流转RTMP测试环境的方法解析

树莓派 RaspBerryPi 网络配置相关与设置usb网络摄像头 进行RTSP 推流

华为海康大华摄像头编译RTSP转RTMP和HTTPFLV

海康威视RTSP摄像头转RTMP推流前端方案(浏览器兼容及权限验证)

使用live555 快速建立rtsp 服务

流媒体服务海康摄像头RTSP视频推流转码拉流直播综合应用:VLC+FFMPEG+Nginx实现RTSP到RTMP网页直播