Вопрос:
Я пытаюсь понять, как работает spydroid (https://code.google.com/p/spydroid-ipcamera/), поэтому я могу написать подобное приложение для своего телефона. Основанный на spydroid вот что я понимаю о RTSP, RTCP и RTP.
RTSP запускается по указанному порту и устанавливает все.
RTCP может работать на любом порту. Существует порт клиента и порт сервера. Это управляющий поток для RTP
RTP может работать на любом порту. Существует порт клиента и порт сервера. Это содержит потоки для аудио и видео. Это сбивает с толку, потому что кажется, что он фактически не отправляет аудио и видео на этот порт. В spydroid он отправляет видео на порт 5006 и аудио на 5004.
Spydroid отправляет это сообщение через RTSP для подтверждения портов…
Транспорт: RTP/AVP/UDP, одноадресный, конечный = 123.456.789.00; client_port = 65234-65235; server_port = 44580-44581; ssrc= ba98a863; mode = play
Я думаю, что это говорит о том, что клиент (VLC в моем случае) прослушивает 65234, используя UDP для RTP и 65235 для RTCP-сообщений. Также spydroid прослушивает 44580 для RTP и 44581 для RTCP. Правильно ли это?
Теперь в последовательности DESCRIBE для RTSP spydroid сообщает клиенту m = video 5006 RTP/AVP 96 Я думаю, что это говорит о том, что он будет отправлять видео через UDP через порт 5006.
Является ли все, что я сказал в приведенных выше предложениях, правильно?
Я действительно хочу знать, как перенаправить эту информацию в правильные порты. Клиентские порты автоматически назначаются VLC. Я попытался запустить эту команду… vlc “rtsp://192.168.1.104: 8086” –rtp-client-port = 58866, но VLC, похоже, игнорирует его и выбирает его собственные порты. Поэтому я переправил порты 8086, 5004 и 5006, но я не знаю, какой порт для пересылки для RTP и RTCP-соединения, потому что он меняется каждый раз. Единственный способ сделать эту работу – переадресовать все порты на мой компьютер. (У меня есть маршрутизатор linksys, и у него есть опция DMZ). Но это плохое решение. Может кто-нибудь, пожалуйста, направить меня в правильном направлении.
Также хорошо знать, что я делаю это, потому что я отправляю все через внешний IP-адрес через Интернет. Где в качестве спайдроида предполагается использовать в локальной сети.
Ответ №1
Я не знаю, как работает RTSP и как настроить VLC, но я знаю вещь или 2 о RTP.
Я предполагаю, что порт клиента означает, что spydroid будет отправлять пакеты, а порт сервера – то, что он будет использовать в качестве исходного порта. Таким образом, на уровне UDP пакет RTP будет выглядеть так:
| SRC_PORT = 44580 | DST_PORT = 65234 |… RTP_PACKET |
Далее: m = видео 5006 RTP/AVP 96
Согласно стандарту SDP 5006 – это порт, в котором спидройд будет прослушивать входящие пакеты RTP
(не уверен, почему), а тип полезной нагрузки RTP будет равен 96.
Итак, проверьте, работает ли VLC для прослушивания порта 65234 и пересылки {44580, 65234} пакетов на ваш компьютер.
Информация, которую вы дали, немного запутанна и кажется противоречивой. Таким образом, на этом не может быть заключено ничего конкретного.
Ответ №2
В соответствии со стандартом SDP…
Фактически это указывает на порт источника.
Порт (диапазон) просто указывает, откуда будет отправляться носитель.
Например, если ваш источник отправляет на 5006, но его маршрутизируется через 10002, где rtsp помогает через транспортный заголовок.
Исходный порт может действительно быть 5006, но промежуточный маршрутизатор или брандмауэр, который находится где-то внутри ЛВС, получил пакет и отправил его через другой порт и адрес.
Большинство программ автоматически не знает о вашей настройке сети и, таким образом, без изменения sdp для использования в внешней сети, он не может использоваться везде вне вашего сетевого адресного пространства.
Если вам нужен порт для сопоставления, вы можете просто вручную настроить свои сокеты и программное обеспечение. (Например, многоадресной рассылки или иным образом существует несколько причин, по которым этот порт (диапазон) должен отличаться от того, что в транспортном заголовке rtsp, но если это… то теперь вы понимаете, как и почему.
Live 555 и некоторые другие отправляют пробный пакет, и если этот пакет возвращается через icmp, исходный порт reset равен 0, поэтому его можно обнаружить, помните, что это может конфликтовать с существующим трафиком с хоста, если это не сделано правильно.
QuickTime и vlc на самом деле завинчивают это (в основном, все) и позволяют впрыскивать прямо к декодеру из любого порта с одного и того же хоста при использовании 0, а ffmpeg и lav не поддерживают правильные диапазоны в медиа-порту.
Точно так же, как и в мыслях, что, если номер порта равен 1 или 65536 или * или -7?
Должно ли это не обрабатываться?
Что делать, если диапазон был * или – или иным образом?
Помните, что только потому, что значение doesnt существует, не означает, что вы не можете сделать правильную вещь в отношении имеющейся информации, если хотите, даже если полученные данные не соответствуют ожиданиям или указаны значение, которое не должно использоваться,