ITADN
mpromonet/v4l2rtspserver
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

CircleCI CirusCI Snap Status GithubCI

Codacy Badge Coverity Scan Build Status Coverage Status OpenSSF Best Practices

Release Download Docker Pulls OpenWrt 24.10 x86_64 package

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:

还有一个使用 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