Подтвердить что ты не робот

RTSP через потоковое видео HTTPS от GStreamer

У меня есть поток, который является RTSP через HTTPS.

Рукопожатие защищено (над 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 через HTTP, но когда я пробую RTSP через 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 ожидает, что поток также будет защищен. Любой фрагмент идеи/кода или пример того, как передавать RTSP поверх HTTPS? Текущая версия, которую я использую, - 1.10.4.

4b9b3361

Ответ 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);

Для связи между моим средним уровнем и сервером. У меня есть 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 Socket сделать рукопожатие для меня с сервером. Я передаю данные/сообщения, которые я получаю с сервера, используя интерфейс, на свой средний уровень, а затем пишу в GStreamer. Точно так же, независимо от данных/сообщений, которые я получаю от GStreamer через интерфейс, я передаю их на средний уровень и затем записываю на сервер. Я использую конвейер для GStreamer.

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

Ответ 2

Это старый вопрос, и он мне немного непонятен, поэтому я выскажу некоторые предположения.

Я думаю, что вы (были) пишете клиент (так как вы пометили Android) в нативном коде (nativeSetPipeline) с помощью C/C++.

Работа с собственным кодом может быть 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++. Вот вариант (не использовал/не проверял это):

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