Проблемы с получением “RTSP через HTTP”

Вопрос или проблема

Есть камера Axis, которая подключена к нашему сайту (camba.tv) через компонент подключения Axis One Click (который выполняет функцию прокси). Мы можем взаимодействовать с этой камерой только через HTTP, установив прокси на адрес нашего сервера OCCC. Если мы хотим получить потоки RTSP (h.264), нам остается только вариант “RTSP через HTTP”. Для этого я следовал секции 3.3 документации axis VAPIX 3. Я отправляю запросы через Fiddler, но не получаю никакого ответа. Однако, когда я ввожу URL (axrtsphttp://1.00408CBEA38B/axis-media/media.amp) в Windows Media Player (с установленным прокси на сервер OCCC 212.78.237.156:3128), плеер может получить RTSP поток через HTTP после входа в систему. Я создал трассировку запросов общения между камерой и Windows Media Player с помощью Wireshark, и запрос, который приносит поток, выглядит следующим образом:

 http://1.00408cbea38b/axis-media/media.amp HTTP/1.1

    x-sessioncookie: 619

    User-Agent: Axis AMC

    Host: 1.00408CBEA38B

    Proxy-Connection: Keep-Alive

    Pragma: no-cache

    Authorization: Digest username="root",realm="AXIS_00408CBEA38B",nonce="000a8b40Y0100409c13ac7e6cceb069289041d8feb1691",uri="/axis-media/media.amp",cnonce="9946e2582bd590418c9b70e1b17956c7",nc=00000001,response="f3cab86fc84bfe33719675848e7fdc0a",qop="auth"



    HTTP/1.0 200 OK

    Content-Type: application/x-rtsp-tunnelled

    Date: Tue, 02 Nov 2010 11:45:23 GMT



    RTSP/1.0 200 OK

    CSeq: 1

    Content-Type: application/sdp

    Content-Base: rtsp://1.00408CBEA38B/axis-media/media.amp/

    Date: Tue, 02 Nov 2010 11:45:23 GMT

    Content-Length: 410



    v=0

    o=- 1288698323798001 1288698323798001 IN IP4 1.00408CBEA38B

    s=Media Presentation

    e=NONE

    c=IN IP4 0.0.0.0

    b=AS:50000

    t=0 0

    a=control:*

    a=range:npt=0.000000-

    m=video 0 RTP/AVP 96

    b=AS:50000

    a=framerate:30.0

    a=transform:1,0,0;0,1,0;0,0,1

    a=control:trackID=1

    a=rtpmap:96 H264/90000

    a=fmtp:96 packetization-mode=1; profile-level-id=420029; sprop-parameter-sets=Z0IAKeNQFAe2AtwEBAaQeJEV,aM48gA==

    RTSP/1.0 200 OK

    CSeq: 2

    Session: 3F4763D8; timeout=60

    Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=060922C6;mode="PLAY"

    Date: Tue, 02 Nov 2010 11:45:24 GMT



    RTSP/1.0 200 OK

    CSeq: 3

    Session: 3F4763D8

    Range: npt=0-

    RTP-Info: url=rtsp://1.00408CBEA38B/axis-media/media.amp/trackID=1;seq=7392;rtptime=4190934902

    Date: Tue, 02 Nov 2010 11:45:24 GMT
[Бинарное содержимое потока]

Но когда я копирую этот запрос в Fiddler, я получаю только код статуса 200 с установленным content-type application/x-rtsp-tunneled, и нет данных потока. Единственное, что я делаю иначе с потоком, это использовать Basic в заголовке авторизации вместо Digest, и я не получаю код статуса 401 (Не авторизован). Можете ли вы объяснить, что здесь происходит? Как я могу составить последовательности запросов, чтобы получить поток в Fiddler? Если необходимо, я могу загрузить дамп запроса Wireshark где-нибудь.

“RTSP через HTTP” фактически состоит из 2 сеансов. Первый – это GET-сеанс, который используется для потоковой передачи данных и ответов на команды, а второй – это POST-сеанс, который используется для отправки команд.
Вы описали только первый сеанс. Чтобы получить RTSP поток, вам необходимо реализовать второй сеанс тоже.
Взаимодействие должно выглядеть следующим образом:

  1. Создать первое соединение и отправить GET-запрос с соответствующими заголовками x-sessioncookie и Authorization.
  2. Создать второе соединение и отправить POST-запрос с соответствующими заголовками и вашей командой.
  3. Получить ответ на вашу команду в первом соединении как часть GET-ответа.
  4. Продолжить отправку команд во втором соединении и получать данные в первом соединении.

Ответ или решение

Проблема, с которой вы столкнулись при попытке получить поток RTSP через протокол HTTP, требует внимания к деталям работы с RTSP-обработкой через HTTP-прокси, а также правильного управления сессиями. Давайте рассмотрим ключевые моменты и предложим решение.

Контекст Проблемы

Вы используете камеру Axis, подключенную к вашему сайту через OCCC (Axis One Click Connection Component), что является прокси-сервером для взаимодействия с этой камерой. Для получения потоков RTSP (H.264) вы выбрали вариант "RTSP over HTTP", что действительно подходит в условиях использования прокси-сервера.

Правильное Управление Сессиями

Как вы уже заметили, работа с RTSP over HTTP включает в себя две сессии:

  1. GET-сессия — для получения данных потока и ответов на команды.
  2. POST-сессия — для отправки команд на камеру.

Ваше текущее взаимодействие состоит только из первой GET-сессии, что является причиной отсутствия потоковых данных в вашем ответе.

Шаги для Корректной Реализации

Чтобы успешно настроить получение стрима, следуйте приведенному ниже плану:

  1. Создайте первую GET-сессию.

    • Отправьте корректный GET-запрос с заголовками x-sessioncookie и Authorization (используйте Digest, как это делаете через Windows Media Player):

      GET http://1.00408CBEA38B/axis-media/media.amp HTTP/1.1
      x-sessioncookie: <ваш-код-сессии>
      Authorization: Digest username="root", realm="AXIS_00408CBEA38B", 
      nonce="<nonce>", uri="/axis-media/media.amp", cnonce="<cnonce>", 
      nc=00000001, response="<response>", qop="auth"
  2. Создайте вторую POST-сессию.

    • Вам нужно будет отправить POST-запрос с командой, необходимой для начала потока. Вот базовый пример:

      POST http://1.00408CBEA38B/axis-media/media.amp HTTP/1.1
      x-sessioncookie: <ваш-код-сессии>
      Content-Type: application/x-rtsp-tunnelled
    • В теле запроса укажите команду RTSP, например, PLAY, PAUSE и т.д. Убедитесь, что используете корректный формат.

  3. Получите ответ на команду в первой сессии.

    • Ответ на вашу команду будет возвращён в GET-сессии в виде RTP-данных, что и является потоком, который вы хотите получить.
  4. Продолжайте отправлять команды через POST-сессию.

    • После установления потока, задавайте команды продолжительно (например, для управления потоком) через POST, пока поток будет активен. Результат будет возвращён в GET-сессию.

Возможные Ошибки

  • Authorization: Если вы получаете ответ 200 с Content-Type: application/x-rtsp-tunneled, это, возможно, сигнализирует об отсутствии правильной авторизации. Необходимо убедиться, что вы точно копируете заголовки из успешного запроса Windows Media Player.

  • Синтаксис запросов: Убедитесь, что ваш синтаксис запросов строго соответствует требованиям документации, включая корректное управление сессиями и заголовками.

  • Тестирование с помощью Fiddler: Убедитесь, что вы правильно настраиваете Fiddler для обработки RTSP-потоков, так как некоторые клиенты могут ожидать определённый порядок и тип запросов.

Заключение

Правильное управление RTSP over HTTP требует тщательной настройки сессий и заголовков. Если ваши запросы сформулированы согласно описанным шагам, вы должны получить поток RTSP корректно. Продолжайте отлаживать ваши запросы с использованием Wireshark для отслеживания взаимодействия с камерой и Fiddler для тестирования сессий.

Оцените материал
Добавить комментарий

Капча загружается...