首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于GStreamer的RTSP over HTTPS视频流

基于GStreamer的RTSP over HTTPS视频流
EN

Stack Overflow用户
提问于 2017-08-15 17:07:37
回答 2查看 2.9K关注 0票数 19

我有一个流,这是基于HTTPS的RTSP。

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

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

我尝试了多种方法,但似乎都不起作用。例如,在我开始获取流之后,我尝试将其写入本地端口,并将该URL传递给GStreamer,但它不能播放。

我是一个新的GStreamer,所以我对球员的知识是有限的。我正在寻找一种方法来完成通过GStreamer的握手,这是HTTPS(安全),然后我得到的流是不加密的。如果有人在类似的东西上工作,请让我知道任何方式来流式RTSP。我试过像这样的东西

代码语言:javascript
复制
nativeSetPipeline("rtspsrc location=rtsph://<URL of the video stream> latency=100 ! rtph264depay ! avdec_h264 ! glimagesink");

上面的管道默认情况下GStreamer播放RTSP over HTTP,但当我尝试使用RTSP over HTTPS时,如下所示

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-30 13:54:15

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

代码语言:javascript
复制
            channel = ServerSocketChannel.open();
            channel.configureBlocking(false);

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

用于我的中间层和服务器之间的通信。我有一个SSL连接,像这样的东西。

代码语言:javascript
复制
            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中使用的管道是。

代码语言:javascript
复制
pipelineURL = String.format("playbin uri=\"%s\" ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! xvimagesink", url);
票数 1
EN

Stack Overflow用户

发布于 2018-08-23 14:07:15

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

我想你是在用C/C++的原生代码(nativeSetPipeline)写一个客户端(因为你给Android加了标签)。

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

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

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

代码语言:javascript
复制
// ...
HTTPResponse response;
std::istream& inputStream = session.receiveResponse(response);
StreamCopier::copyStream(inputStream, gstream);
// ...

您可能还想在C++中使用GStreamer。这里有一个选项(还没有用过/测试过):

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45689798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档