我有一个流,这是基于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播放RTSP over HTTP,但当我尝试使用RTSP over HTTPS时,如下所示
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。
发布于 2019-08-30 13:54:15
因为我找不到任何让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);发布于 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流兼容...
// ...
HTTPResponse response;
std::istream& inputStream = session.receiveResponse(response);
StreamCopier::copyStream(inputStream, gstream);
// ...您可能还想在C++中使用GStreamer。这里有一个选项(还没有用过/测试过):
https://stackoverflow.com/questions/45689798
复制相似问题