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.

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);

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

Я думаю, что вы (писали) клиент (так как вы пометили 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

Другие вопросы по тегам