v4l2rtspserver
这是一个来自以下设备的流媒体源:
- 支持 H264、HEVC、JPEG、VP8 或 VP9 捕获的 Video4Linux 设备。
- 支持 PCM S16_BE、S16_LE、S32_BE 或 S32_LE 的 ALSA 设备
RTSP 服务器支持:
- RTP/UDP 单播
- RTP/UDP 组播
- RTP/TCP
- RTP/RTSP/HTTP
HTTP 服务器支持(对于可以复用为传输流的捕获格式,使用 -S 选项可用):
- HLS
- MPEG-DASH
依赖项
- liblivemedia-dev 许可证 LGPL > live.2012.01.07 (需要 StreamReplicator)
- libv4l2cpp 无许可证
- liblog4cpp5-dev 许可证 LGPL (可选) 如果不存在 liblog4cpp5-dev,则使用基于 std::cout 的简单日志。
- libasound2-dev 许可证 LGPL (可选) 如果构建环境中不存在 libasound2-dev,则没有音频支持。
- libssl-dev (可选) 如果不存在 libssl-dev,则 rtsps/srtp 不可用
用法
./v4l2rtspserver [-v[v]] [-Q queueSize] [-O file] \
[-I interface] [-P RTSP port] [-p RTSP/HTTP port] [-m multicast url] [-u unicast url] [-M multicast addr] [-c] [-t timeout] \
[-r] [-s] [-W width] [-H height] [-F fps] [device1] [device2]
-v : 详细
-vv : 非常详细
-Q length: 帧队列数量 (默认 10)
-O output: 将捕获的帧复制到文件或 V4L2 设备
RTSP 选项 : -I addr : RTSP 接口 (默认自动检测) -P port : RTSP 端口 (默认 8554) -p port : RTSP over HTTP 端口 (默认 0) -U user:password : RTSP 用户名和密码 -R realm : 使用 md5 密码 'md5(::') -u url : 单播 url (默认单播) -m url : 组播 url (默认组播) -M addr : 组播组:端口 (默认为 random_address:20000) -c : 不重复配置 (默认在 IDR 帧前重复配置) -t secs : RTCP 过期超时 (默认 65) -S[secs] : HTTP 分段时长 (启用 HLS & MPEG-DASH) -x : 启用 SRTP -X : 启用 RSTPS
V4L2 选项 :
-r : 使用 read 接口进行 V4L2 捕获 (默认使用内存映射缓冲区)
-w : 使用 write 接口进行 V4L2 捕获 (默认使用内存映射缓冲区)
-B : 使用阻塞模式进行 V4L2 捕获 (默认使用非阻塞模式)
-s : 使用 live555 主循环进行 V4L2 捕获 (默认使用独立的读取线程)
-f : 使用当前捕获格式进行 V4L2 捕获 (-W,-H 将被忽略)
-fformat : 使用指定格式进行 V4L2 捕获 (-W,-H 将被使用)
-W width : V4L2 捕获宽度 (默认 640)
-H height: V4L2 捕获高度 (默认 480)
-F fps : V4L2 捕获帧率 (默认 25, 0 表示禁用帧率设置)
-G <w>x<h>[x<f>] : V4L2 捕获格式 (默认 0x0x25)
ALSA 选项: -A freq : ALSA 采集频率和声道(默认 44100) -C channels: ALSA 采集声道(默认 2) -a fmt : ALSA 采集音频格式(默认 S16_LE)
device : V4L2 采集设备和/或 ALSA 设备(默认 /dev/video0)
当不存在音频支持时,使用 -h 参数运行时不会打印 ALSA 选项。
当定义了几乎一个用户时,启用身份验证。您可以配置凭据:
-
使用明文密码:
-U foo:bar -U admin:admin -
使用 md5 密码:
-R myrealm -U foo:$(echo -n foo:myrealm:bar | md5sum | cut -d- -f1) -U admin:$(echo -n admin:myrealm:admin | md5sum | cut -d- -f1)
可以通过不同方式组合 RTSP 会话:
- v4l2rtspserver /dev/video0 : 一个 RTSP 会话,包含捕获 V4L2 设备 /dev/video0 的 RTP 视频
- v4l2rtspserver ,default : 一个 RTSP 会话,包含捕获 ALSA 设备 default 的 RTP 音频
- v4l2rtspserver /dev/video0,default : 一个 RTSP 会话,包含 RTP 音频和 RTP 视频
- v4l2rtspserver /dev/video0 ,default : 两个 RTSP 会话,第一个包含 RTP 视频,第二个包含 RTP 音频
- v4l2rtspserver /dev/video0 /dev/video1 : 两个 RTSP 会话,均包含 RTP 视频
- v4l2rtspserver /dev/video0,/dev/video0 : 一个 RTSP 会话,包含 RTP 音频和 RTP 视频(ALSA 设备与 V4L2 设备关联)
构建
-
构建
cmake . && make
如果未安装 live555,它将从 live555.com 下载并编译它。如果未安装 asound,ALSA 将被禁用。
如果仍然无法工作,你需要阅读 Makefile。
-
安装(可选)
sudo make install -
打包(可选)
cpack .
使用 Raspberry Pi 摄像头
此 RTSP 服务器使用以下组件与 Raspberry Pi 摄像头配合工作:
-
开源 V4L2 驱动 bcm2835-v4l2
sudo modprobe -v bcm2835-v4l2
使用 v4l2loopback
对于提供未压缩格式的摄像头,v4l2tools 可以将视频压缩到中间虚拟 V4L2 设备 v4l2loopback:
/dev/video0 (摄像头设备)-> v4l2compress -> /dev/video10 (v4l2loopback 设备) -> v4l2rtspserver
此工作流程可以这样设置:
modprobe v4l2loopback video_nr=10
v4l2compress -fH264 /dev/video0 /dev/video10 &
v4l2rtspserver /dev/video10 &
播放 HTTP 流
当 v4l2rtspserver 使用 '-S' 参数启动时,它还通过 HTTP 提供对流的访问。
这些流可以这样播放:
* 对于 MPEG-DASH:
MP4Client http://..../unicast.mpd
* 对于 HLS:
vlc http://..../unicast.m3u8
gstreamer-launch-1.0 playbin uri=http://.../unicast.m3u8
现在可以直接从浏览器播放 HLS URL:
- 使用 Firefox 安装 Native HLS addons
- 使用 Chrome 安装 Native HLS playback
还有一个使用 hls.js 的小型 HTML 页面。
使用 Docker 镜像
您可以使用 docker 镜像启动应用程序:
docker run -p 8554:8554 -it mpromonet/v4l2rtspserver
您可以使用以下命令从主机暴露 V4L2 设备:
docker run --device=/dev/video0 -p 8554:8554 -it mpromonet/v4l2rtspserver
容器的入口点是 v4l2rtspserver 应用程序,然后您可以:
-
使用以下命令获取帮助:
docker run -it mpromonet/v4l2rtspserver -h -
指定一些参数运行容器:
docker run --device=/dev/video0 -p 8554:8554 -it mpromonet/v4l2rtspserver -u "" -H640 -W480