Как заставить клиента переключить транспорт RTP с UDP на TCP?
Если клиент хочет посмотреть поток, который находится на моем RTSP-сервере, он сначала пытается настроить поток через протокол UDP. Как я могу сказать, что мой сервер поддерживает только RTP/AVP / TCP и что он должен переключать транспорты?
Я хочу прекратить поддержку UDP на моем сервере, но все клиенты сначала пытаются настроить сеанс через UDP, а затем они делают это через TCP... и я хочу как можно скорее переключить их на TCP в протоколе RTSP.
Как я могу это сделать это?
6 ответов
чтобы расширить ответ для android, Для клиентов Android, они всегда будут пытаться установить UDP соединения.
для OpenCore и StageFright я могу подтвердить, что если я верну "461 неподдерживаемый транспорт" с моего сервера в ответ на первый запрос установки для передачи UDP, оба этих клиента немедленно попытаются установить TCP-соединение через порт RTSP.
все остальные ответы описаны здесь: http://www.ietf.org/rfc/rfc2326.txt
насколько я знаю, на стороне сервера нет управления предпочтениями типа транспорта. Сервер должен быть сделан общим, он должен поддерживать RTP через UDP, RTP через TCP, RTP через RTSP и RTP через RTSP через HTTP(Ы). И его клиенты выбирают, какой транспорт выбрать. Поле транспорт сначала отправляется в запросе установки
1) UDP
C->A: SETUP rtsp://audio.example.com/twister/audio.en RTSP/1.0
CSeq: 1
Transport: RTP/AVP/UDP;unicast;client_port=3056-3057
2) TCP
C->A: SETUP rtsp://audio.example.com/twister/audio.en RTSP/1.0
CSeq: 1
Transport: RTP/AVP/TCP;unicast;client_port=3056-3057
3) RTP через RTSP и RTP через RTSP через HTTP(S)
S->C: RTSP/1.0 200 OK
CSeq: 2
Date: 05 Jun 1997 18:57:18 GMT
Transport: RTP/AVP/TCP;interleaved=0-1
как мы видим, "транспорт тип " запрос отправляется клиентской стороной.
Если вы хотите поддерживать только сервер TCP, вы можете отправить " 400 плохой запрос "или" 461 неподдерживаемый транспорт " в ответ на запрос установки, как предложено вами, или другим способом отправить 200 OK, но не передавать пакеты RTP. Клиент будет тайм-аут и узнать, что он находится за прокси, и он отправит запрос установки снова с параметром RTP/AVP/TCP (не идеальный случай).
OK один из способов-отправить "400 Bad Request" в качестве ответа на запрос настройки клиента... и он автоматически переключается на протокол TCP. Это для RealOne и QuickTime.
но я не уверен, что он будет работать на всех других игроков, так как это хак.
есть другие идеи? =|
Если вы использовали ffmpeg, вы можете принудительно переключить протокол транспортного уровня rtsp.
av_dict_set(&format_opts, "rtsp_transport", "tcp", 0);
err = avformat_open_input(&ic, is->filename, is->iformat, &format_opts);
какой клиент подключается к вашему серверу? Некоторые клиенты могут быть запущены с помощью метода URI в URL-адресе. Например, можно указать rtspt:/ / myhost / path.sdp.
Если у вас есть контроль над клиентом/серверами, вы можете использовать заголовок Require на клиентах и неподдерживаемый на серверах, чтобы указать, что UDP не поддерживается; но большинство клиентов, которых я видел, не используют это.
вы можете попытаться передать заголовок "transport" в ответ на запрос описания и указать, что ваш сервер поддерживает только транспорт RTP/AVP/TCP, и клиент должен знать, что UDP не поддерживается.