GStreamer通过HTTPS视频流传输RTSP

Pun*_*uLz 19 https android rtsp gstreamer 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");
Run Code Online (Sandbox Code Playgroud)

上面的管道默认工作,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");
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为GStreamer也希望流也得到保护.有关如何通过HTTPS流式传输RTSP的任何想法/代码段或示例?我使用的当前版本是1.10.4.

Pun*_*uLz 1

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

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

            InetAddress ih = InetAddress.getLocalHost();
            InetSocketAddress isa = new InetSocketAddress(inetAddress, inetPort);
            channel.socket().bind(isa);
Run Code Online (Sandbox Code Playgroud)

用于我的中间层和服务器之间的通信。我有一个 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()));
            }
Run Code Online (Sandbox Code Playgroud)

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

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