我在 AMD64 机器上使用 Ubuntu,并运行 OBS 使用 rtsp 连接到本地摄像头,然后将其流式传输到公共 rtmp 服务器。它可以工作,但问题是在 OBS 中,rtsp 已知不可靠,并且会在 x 小时或天后丢失相机图像或冻结,然后 OBS 最终流式传输黑屏。我需要继续监控它,并在必要时手动重新启动 rtsp 源。我正在寻找更可靠的解决方案。
我一直在阅读有关 gstreamer 的文章,这似乎是一条充满希望的路线,但构建管道很复杂。我尝试了以下方法,它似乎有效:
gst-launch-1.0 -e rtspsrc location="rtsp://address" protocols=tcp latency=0 ! fakesink
现在我只需要知道如何将其解析为 rtmp。一个障碍是源是 1280x720/10fps,而 rtmp 服务器期望是 1280x720/25fps,因此中间需要进行某种转换。如有任何建议,将不胜感激。我已经尝试过下面的方法,几乎可以工作,但它会抛出一些错误。重要的是要提到我不需要或不想要任何音频。
gst-launch-1.0 -e rtspsrc location="rtsp://address" protocols=tcp latency=0 ! rtph264depay ! h264parse ! flvmux name=mux streamable=true ! rtmpsink sync=true async=true location='rtmp://address live=true' audiotestsrc is-live=true ! audioconvert ! audioresample ! audio/x-raw,rate=48000 ! voaacenc bitrate=96000 ! audio/mpeg ! aacparse ! audio/mpeg, mpegversion=4 ! mux.
要获得 1280x720/25fps 输出,您可以对管道进行以下调整:
gst-launch-1.0 -e rtspsrc location="rtsp://address" protocols=tcp latency=0 ! "application/x-rtp" ! rtph264depay ! decodebin ! videoconvert ! videorate max-rate=25 ! "video/x-raw,framerate=25/1" ! x264enc ! flvmux name=mux streamable=true ! rtmpsink sync=true async=true location='rtmp://address live=true'
注意:我已经删除了与音频相关的元素,因为您提到音频对于您的用例并不重要。您可以自行决定重新添加这些部分。
如果您更喜欢使用原始管道而不重新编码,您还可以考虑使用 RTSP 源中的可变帧速率功能,“if present”。您可以将 RTSP 流配置为最大帧速率为 25 fps(也在流帧速率元数据中指示)。此方法有助于实现高达 25 FPS 的动态帧速率。然而,重要的是远程 RTMP 使用者应该能够处理此类流。通常,并非每个 RTMP 服务器或客户端都具备有效管理 VFR 的能力。