#rtsp #camera #mp4 #video-stream #command-line-utilities

app retina-record

命令行应用程序,用于从RTSP摄像机录制MP4视频

6个版本

0.2.2 2024年4月11日
0.2.1 2024年3月26日
0.1.2 2024年3月13日
0.1.1 2024年2月18日

#24 in 视频

MIT/Apache

51KB
1K SLoC

retina-record

Crates.io Crate License Rust

命令行应用程序,用于从RTSP摄像机录制MP4视频。

文档和仓库位于 github.com/strawlab/retina-record

功能

  • 不将相机中的视频转码,而是直接将已编码的H264视频流式传输到.mp4文件。因此,CPU使用率最小。
  • 在.mp4文件中内联存储额外的时序数据。请参阅以下“时序数据”。
  • 基于 retina Rust 包,以支持H264 RTSP摄像机。这是与 Moonfire NVR 相同的库。
  • 纯Rust编写。

时序数据

retina-record 在录制过程中保存额外的时序数据。这允许尽可能精确地重建单个相机帧的时序以及同步多台摄像机的视频。总体理念是以无损方式记录来自摄像头的时序信息以及retina-record 收到数据时的纳秒级时间。如果相机具有良好的内部时钟(例如,因为它正在使用行为良好的NTP客户端),则相机提供的戳记应该足够精确地重建图像的获取时间(请参阅以下关于“相当精确”的详细信息)。或者,如果相机的内部时钟不是那么理想,则retina-record 保存的戳记可以用于在假设网络延迟可以忽略不计以及retina-record 运行的PC上的时钟是可靠的情况下对齐数据。此外,通过这些数据类型的部分冗余,可以在使用retina-record 录制的视频中实现更复杂的时间重建方法。这些数据使用补充增强信息(SEI)保存在MP4文件中的H264视频轨道中。

帧时序数据

每个帧都存储了来自摄像头的“RTP时间戳”和来自 retina-record 的“接收时间戳”。在H264流中作为补充增强信息(SEI)保存的数据的正式描述可以在 strawlab.org/89H 找到。

发送者报告时间数据

偶尔(每几秒)摄像头会发送带有附加NTP时间戳的报告,并与RTP和接收时间戳一起存储。在H264流中作为补充增强信息(SEI)保存的数据的正式描述可以在 strawlab.org/o8B 找到。

NTP时间戳采用64位NTP时间戳格式,因此理论上具有纳秒级精度。实际上,这取决于摄像头内部时钟的质量。

安装

  1. 安装rust
  2. 运行 cargo install retina-record --locked

运行

以下是一个示例命令行,用于从摄像头录制到文件 output.mp4。这将一直运行,直到使用Ctrl-C停止程序。您需要更新摄像头的URL,以及可能的密码和输出文件名。

retina-record --url rtsp://192.168.1.32/cam1/onvif-h264 --username admin --password secret-password output.mp4

依赖关系

~18–30MB
~443K SLoC