GStreamer通过HTTPS视频流传输RTSP

时间:2017-08-15 09:07:37

标签: android https gstreamer rtsp gstreamer-1.0

我有一个基于HTTPS的RTSP流。

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

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

我尝试了很多东西但似乎没什么用。例如在我开始获取流后,我尝试将其写入本地端口并将该URL传递给GStreamer,但它没有播放。

我是这个GStreamer的新手,所以我对玩家的了解有限。我正在寻找一种方法来通过GStreamer完成握手,这是HTTPS(安全),然后我得到的流没有加密。如果有人做过类似的事情,请告诉我任何流式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的任何想法/代码段或示例?我使用的当前版本是1.10.4。

2 个答案:

答案 0 :(得分:0)

这是一个古老的问题,对我来说还不太清楚,所以我要陈述一些假设。

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

使用本机代码可以是PITA,但是如果我的假设正确,则可以使用Poco Project库将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 ++一起使用。这是一个选项(尚未使用/测试过):

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

答案 1 :(得分:0)

因为我找不到任何方法让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()));
            }

我定义了两个接口来传输数据/消息。 因此,基本上,我让SSL套接字为我与服务器进行握手。 我使用接口从服务器获取的数据/消息传递到中间层,然后写入GStreamer。同样,无论我使用接口从GStreamer获得的任何数据/消息,都将其传递到中间层,然后将其写入服务器。 我用于GStreamer的管道是。

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