我有一个基于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。
答案 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 ++一起使用。这是一个选项(尚未使用/测试过):
答案 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);