Проверьте, закончился ли поток RTSP - PullRequest
1 голос
/ 15 февраля 2012

Сначала я попытаюсь объяснить, что именно я хочу сделать:

У меня есть IP-камера, в которой есть круговой буфер, из которого я хочу прочитать данные.Связь между камерой и моим приложением происходит по протоколу RTSP, что означает, что у меня есть TCP-соединение с камерой.Сама камера способна передавать данные по RTP.

Теперь важная часть заключается в том, что, когда камера начинает потоковую передачу, мое приложение должно НЕ считывать данные.В сети есть какой-то пассивный регистратор данных, который отвечает за запись данных.

Проблема в том, что, пока камера выполняет потоковую передачу, гнездо из моего приложения нужно открывать, иначе камерапрекратит потоковую передачу.

Итак, давайте посмотрим, что у меня пока есть:

Я открываю сокет, который подключается к камере и затем отправляет необходимые команды RTSP OPTIONS, DESCRIBE,SETUP, а затем PLAY.После этого мое гнездо остается открытым, и камера транслируется.

Теперь вот сложная часть:

Как я уже сказал, я не могу проанализировать все данные UDP.Но как я могу определить, когда закончился поток?На wireshark я вижу, что, когда поток заканчивается, я получаю сообщение RTCP, которое говорит: Sender Report Goodbye.

Это точка, где я хотел бы закрыть свое гнездо, но как я могу определить, что камера имеетзакончил без разбора каких-либо данных UDP?

Ответы [ 4 ]

2 голосов
/ 21 февраля 2012

Почему вы не хотите анализировать пакеты RTCP: это не очень сложно.

Нет смысла, что камера прекращает потоковую передачу после закрытия TCP-соединения. Согласно РЦП РФЦ:

Нет понятия соединения RTSP; вместо этого сервер поддерживает сеанс, помеченный идентификатором. Сеанс RTSP никоим образом не связан к соединению транспортного уровня, такому как соединение TCP. Во время Сеанс RTSP, клиент RTSP может открыть и закрыть много надежных транспортные соединения с сервером для выдачи запросов RTSP. В качестве альтернативы, он может использовать транспортный протокол без установления соединения, такой как UDP.

Если моя интерпретация неверна, закрытие сокета не должно влиять на медиапоток. Вы должны заставить производителя соответствовать спецификации RTSP.

FYI, как правило, рекомендуется, чтобы сервер RTSP превысил время ожидания соединения TCP, если не было выполнено никаких действий. AFAIR по умолчанию составляет 60 секунд. Вы можете сохранить соединение, отправляя периодические запросы GET_PARAMETER.

В качестве обходного пути, поскольку вы выполняете RTSP, вам известны номера входящих портов для соединений RTP и RTCP. Если вы не хотите анализировать RTCP для поиска сообщения BYE, вы можете просто отбросить все входящие пакеты RTP и RTCP, а затем, если в течение x секунд на порт RTP не было получено пакетов, закрыть соединение с сервером.

1 голос
/ 23 марта 2012

Хорошо, можно определить конец потока.

После запуска потока есть две линии связи. Существует поток RTP, который содержит все необработанные данные. Кроме того, есть некоторые данные RTCP, которые можно использовать для управления потоком.

Важной частью является то, что данные отправляются по разным портам. Эти порты определены в запросе RTSP SETUP. Теперь, когда камера выполняет потоковую передачу, данные, поступающие на RTP, могут быть просто проигнорированы, как и предполагалось, в то время как вы можете открыть сокет для прослушивания на порту RTCP. Там вы получите немного Sender Reports, пока поток не закончится (с последним Sender Report Goodbye). Если вы читаете это сообщение, вы знаете, что можете закрыть его, так как поток закончился.

Примечание. На некоторых устройствах вам может понадобиться отправить Receiver Reports в качестве ответа на Sender Reports, иначе поток может остановиться, так как устройство считает, что время ожидания клиента истекло.

0 голосов
/ 12 декабря 2012

Как сказал Тоби, пакет RtcpGoodbye обычно указывает, что сеанс Rtp окончен.

Если вам нужна библиотека для анализа пакетов, извлеките http://net7mma.codeplex.com/

Он имеет RtspClient и RtspServerреализации и работает с VLC, так что вы можете использовать Wireshark, чтобы увидеть, как он сообщает клиенту, что шоу завершено или просто разрыв в коде при подключении к RtspServer с VLC.

Если вам нужно что-то еще, дайте мне знать!

0 голосов
/ 21 февраля 2012

Поскольку вам необходимо быть на вершине данных, отправляемых с помощью RTP / UDP, чтобы эффективно определять окончание широковещания, я могу думать только о реализации полного клиента RTSP (с частью RTP) и повторной отправке RTP наадрес интереса.В противном случае, имея только управляющее соединение RTSP, не видя фактических данных RTP, маловероятно, что вы можете запросить или иным образом получить состояние передачи данных RTP, независимо от того, является ли оно все еще активным или достигло его конца.

...