我的目标是一个 shell 脚本或 Python 实用程序,以类似于以下 (.csv) 示例的格式循环浏览 YouTube/RSTP 源流列表(.csv、.yaml 或 .json):
url,overlay_text,delay_ms
rtsp://admin:[email protected]:554/Streaming/Channels/101,THIS IS OVERLAY TEXT,5000
https://www.youtube.com/watch?v=dQw4w9WgXcQ,THIS IS MORE OVERLAY TEXT,5000
.
.
.
rtsp://admin:[email protected]:554/Streaming/Channels/101,THIS IS OVERLAY TEXT,5000
https://www.youtube.com/watch?v=dQw4w9WgXcQ,THIS IS MORE OVERLAY TEXT,5000
对于文本文件中的每条记录,实用程序将:
overlay_text
添加到流中delay_ms
该记录它可以像 Bash shell 脚本一样简单,读取输入文本文件并迭代它,使用适当的管道参数运行 Gstreamer
gst-launch-1.0
命令。
我可以处理文本文件的读取以及 Bash 或 Python 中的迭代。我只需要知道调用(和终止)gstreamer 以添加文本覆盖并公开为 RTSP 端点的正确方法。
解决问题的最佳方法是使用 gstreamer 用 C 或 Python 编写应用程序。然而,对于您想要完成的任务,使用 gst-launch-1.0 创建的简单管道就足够了。我不是 bash 脚本方面的专家,所以我不会评论如何实现它。我可以为您编写一个简单的管道,在给定 rtsp 源的情况下添加文本叠加层,然后将其转发到另一个设备。管道会是这样的:
gst-launch-1.0 rtspsrc location=rtsp://your_rtsp_source/path ! rtph264depay ! avdec_h264 ! autovideoconvert ! textoverlay text="Your text" valignment=top halignment=left ! autovideoconvert ! x264enc ! rtph264pay ! udpsink host=192.168.1.2 port=12444
(host为接收设备IP,port为转发流的设备上使用的端口)
有更多自定义选项可用,使用 gst-inspect-1.0 textoverlay 查看可用的内容,例如文本大小、字体...
请记住,存在用于解码和编码 h264(或 h265,如果是这种情况)的特定元素,使用
gst-inspect-1.0 | grep h264
或
gst-inspect-1.0 | grep h265
将列出您设备上可用的元素,或者您也可以在 gstreamer 网站上搜索可用元素列表。上述管道仅适用于流式传输到 1 个设备的情况,如果您想要多播,请以类似的方式使用 multiudpsink。
使用udp接收器要求您的接收设备具有有关传入流的最少信息。配置如下的简单 .sdp 文件就足够了:
c=IN IP4 192.168.1.56
m=video 12444 RTP/AVP 96
a=rtpmap:96 H264/90000
其中 192.168.1.56 是流媒体设备的 IP,12444 是将流推送到的端口,H264 是流的编码方式。然后文件只需保存为 name.sdp 即可。
使用上面的 .sdp 配置文件并使用带有 VLC 的 192.168.1.2 机器,我可以看到来自 192.168.1.56:12444 的流:
为了完整起见,我在 192.168.1.56 上用于测试的管道如下:
gst-launch-1.0 videotestsrc ! video/x-raw, width=1920, height=1080 ! x264enc ! rtph264pay ! udpsink host=192.168.1.2 port=12444