GStreamer 的 RTSP over HTTPS 视频流

RTSP over HTTPS video streaming by GStreamer

我有一个基于 HTTPS 的 RTSP 流。

握手是安全的(通过 https),但握手完成后的数据未加密(在 RTSP 中)。

GStreamer 默认情况下不会流式传输,因为它希望数据也被加密(在 RTSPS 中),这不是我的情况。

我尝试了多种方法,但似乎没有任何效果。例如在我开始获取流后,我尝试将其写入本地端口并将 URL 传递给 GStreamer,但它不播放。

我是这个 GStreamer 的新手,所以我对播放器的了解有限。我正在寻找一种通过 HTTPS(安全)的 GStreamer 完成握手的方法,然后我获得的流未加密。如果有人从事过类似的工作,请告诉我任何流式传输 RTSP 的方法。我试过类似

nativeSetPipeline("rtspsrc location=rtsph://<URL of the video stream> latency=100 ! rtph264depay ! avdec_h264 ! glimagesink");

上面的管道默认情况下工作,GStreamer 通过 HTTP 播放 RTSP,但是当我尝试通过 HTTPS 播放 RTSP 时,类似

nativeSetPipeline("rtspsrc debug = TRUE do-rtcp=false location=\"rtspsh://<secured URL of the stream>" latency=100 do-rtsp-keep-alive=true ! rtph264depay ! avdec_h264 ! glimagesink");

这不起作用,因为 GStreamer 期望流也受到保护。 关于如何通过 HTTPS 流式传输 RTSP 的任何 idea/code 片段或示例?我目前使用的版本是1.10.4.

这是一个老问题,我有点不清楚,所以我会提出一些假设。

我认为您正在(正在)使用 C/C++ 在本机代码 (nativeSetPipeline) 中编写客户端(因为您标记了 Android)。

使用本机代码可能是一个 PITA,但如果我的假设是正确的,您可以使用 Poco 项目库将 HTTPS 连接的输出重定向到您的 RTSP 播放器。您需要建立 HTTPS 连接并将输出流定向到您的 GStreamer 库。

https://pocoproject.org/docs/Poco.Net.HTTPSClientSession.html

我假设您可以使 std::ostream 与 GStreamer 流兼容...

// ...
HTTPResponse response;
std::istream& inputStream = session.receiveResponse(response);
StreamCopier::copyStream(inputStream, gstream);
// ...

您可能还想将 GStreamer 与 C++ 结合使用。这是一个选项(没有 used/tested 这个):

https://wiki.gnome.org/Projects/gstreamermm

因为我找不到任何方法让 GStreamer 在内部完成所有工作。我写了一个中间层。它充当我的服务器和 GStreamer 之间的接口。我打开了两个套接字连接。一个在我的中间层和服务器之间,另一个在 GStreamer 和我的中间层之间。我的中间层和 GStreamer 之间的套接字是本地主机。

            channel = ServerSocketChannel.open();
            channel.configureBlocking(false);

            InetAddress ih = InetAddress.getLocalHost();
            InetSocketAddress isa = new InetSocketAddress(inetAddress, inetPort);
            channel.socket().bind(isa);

用于我的中间层和服务器之间的通信。我有一个类似 SSL 的连接。

            SocketFactory socketFactory = SSLSocketFactory.getDefault();
            socket = socketFactory.createSocket(serverAddress, serverPort);

            if (null == dataInputStream) {
                dataInputStream = new DataInputStream(socket.getInputStream());
            }

            if (null == inputStreamReader) {
                inputStreamReader = new InputStreamReader((socket.getInputStream()));
            }

我定义了两个传输 data/messages 的接口。 所以基本上我让 SSL 套接字为我与服务器握手。 我将使用接口从服务器获取的 data/messages 传递到我的中间层,然后写入 GStreamer。同样,无论 data/messages 我使用接口从 GStreamer 获得什么,我都会将其传递到我的中间层,然后将其写入服务器。 我用于 GStreamer 的管道是。

pipelineURL = String.format("playbin uri=\"%s\" ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! xvimagesink", url);