提问人:3z33etm 提问时间:11/9/2023 更新时间:11/13/2023 访问量:33
循环访问 YouTube/RTSP 流列表,添加文本叠加,并公开为固定的 RTSP 终结点
Iterate over list of YouTube/RTSP streams, add text overlays, and expose as a fixed RTSP endpoint
问:
我的目标是一个 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
对于文本文件中的每条记录,该实用程序将:
- 从指定的源 URL 捕获流
- 将该记录添加到流中
overlay_text
- 代理或以其他方式将其公开为固定/不变的 RTSP 终结点
- 等待该记录
delay_ms
- 杀死那个流,继续下一个,然后重复......使用相同的 RTSP 终结点公开下一个流。因此,对于该 RTSP 流的使用者来说,它似乎只是一个切换到不同源的流。
- 当它到达文本文件中的最后一条记录时,返回到开头
它可以像 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 sink 要求接收设备具有有关传入流的最少信息。一个简单的 .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 的流:
此外,您还可以查看 gstreamer 的 gst-rtsp-server(链接),它略有不同,但具有能够自动处理 .sdp 文件传输的优点,因此接收方只需要 rtsp url。
为了完整起见,我在 192.168.1.56 上用于测试的管道如下:
gst-launch-1.0 videotestsrc ! video/x-raw, width=1920, height=1080 ! autovideoconvert ! textoverlay text="Your text" valignment=top halignment=left ! autovideoconvert ! x264enc ! rtph264pay ! udpsink host=192.168.1.2 port=12444
评论