Android GStreamer通过HTTPS传输的RTSP视频

Android GStreamer通过HTTPS传输的RTSP视频,android,https,gstreamer,rtsp,gstreamer-1.0,Android,Https,Gstreamer,Rtsp,Gstreamer 1.0,我有一个通过HTTPS的RTSP流 握手是安全的(通过https),但握手完成后的数据未加密(在RTSP中) GStreamer默认情况下不会流式传输,因为它希望数据也会被加密(在RTSPS中),这在我的情况下不是这样 我尝试了很多方法,但似乎都不管用。e、 在我开始获取流之后,我尝试将其写入本地端口,并将该URL传递给GStreamer,但它没有播放 我是这个GStreamer的新手,所以我对这个球员的了解是有限的。我正在寻找通过GStreamer完成握手的方法,GStreamer是HTTPS

我有一个通过HTTPS的RTSP流

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

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

我尝试了很多方法,但似乎都不管用。e、 在我开始获取流之后,我尝试将其写入本地端口,并将该URL传递给GStreamer,但它没有播放

我是这个GStreamer的新手,所以我对这个球员的了解是有限的。我正在寻找通过GStreamer完成握手的方法,GStreamer是HTTPS(安全的),然后我得到的流没有加密。如果有人做过类似的工作,请告诉我任何流式传输RTSP的方法。我试过类似的东西

nativeSetPipeline("rtspsrc location=rtsph://<URL of the video stream> latency=100 ! rtph264depay ! avdec_h264 ! glimagesink");
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");
nativeSetPipeline(“rtspsrc location=rtsph://latency=100!rtph264depay!avdec_h264!glimagesink”);
上面的管道在默认情况下就像GStreamer通过HTTP播放RTSP一样工作,但是当我尝试通过HTTPS播放RTSP时

nativeSetPipeline("rtspsrc location=rtsph://<URL of the video stream> latency=100 ! rtph264depay ! avdec_h264 ! glimagesink");
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");
nativeSetPipeline(“rtspsrc debug=TRUE do rtcp=false location=\“rtspsh://”延迟=100 do rtsp keep alive=TRUE!rtph264depay!avdec_h264!glimagesink”);
这不起作用,因为GStreamer希望流也得到保护。
有关于如何通过HTTPS传输RTSP的想法/代码片段或示例吗?我目前使用的版本是1.10.4。

这是一个老问题,我有点不清楚,因此我将陈述一些假设

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

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

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

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

你可能也想用C++来使用GStreamer。这里有一个选项(尚未使用/测试):


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

你为什么不改用谷歌的ExoPlayer?这对使用ExoPlayer没有帮助。你用过vlc媒体播放器吗?我不确定vlc是否有Android播放器库。嗨@Zahnon,谢谢你的回复,我编写了自己的代码来建立与服务器的HTTPS连接,在我尝试将缓冲流写入本地端口并尝试使用GStreamer读取该缓冲流后,它总是给我一个错误PortUnreachable。我假设这会导致同样的问题。我也会尝试使用Poco,然后再联系你。