Вопрос или проблема
Есть камера 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 поток, вам необходимо реализовать второй сеанс тоже.
Взаимодействие должно выглядеть следующим образом:
- Создать первое соединение и отправить GET-запрос с соответствующими заголовками x-sessioncookie и Authorization.
- Создать второе соединение и отправить POST-запрос с соответствующими заголовками и вашей командой.
- Получить ответ на вашу команду в первом соединении как часть GET-ответа.
- Продолжить отправку команд во втором соединении и получать данные в первом соединении.
Ответ или решение
Проблема, с которой вы столкнулись при попытке получить поток RTSP через протокол HTTP, требует внимания к деталям работы с RTSP-обработкой через HTTP-прокси, а также правильного управления сессиями. Давайте рассмотрим ключевые моменты и предложим решение.
Контекст Проблемы
Вы используете камеру Axis, подключенную к вашему сайту через OCCC (Axis One Click Connection Component), что является прокси-сервером для взаимодействия с этой камерой. Для получения потоков RTSP (H.264) вы выбрали вариант "RTSP over HTTP", что действительно подходит в условиях использования прокси-сервера.
Правильное Управление Сессиями
Как вы уже заметили, работа с RTSP over HTTP включает в себя две сессии:
- GET-сессия — для получения данных потока и ответов на команды.
- POST-сессия — для отправки команд на камеру.
Ваше текущее взаимодействие состоит только из первой GET-сессии, что является причиной отсутствия потоковых данных в вашем ответе.
Шаги для Корректной Реализации
Чтобы успешно настроить получение стрима, следуйте приведенному ниже плану:
-
Создайте первую 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"
-
-
Создайте вторую POST-сессию.
-
Вам нужно будет отправить POST-запрос с командой, необходимой для начала потока. Вот базовый пример:
POST http://1.00408CBEA38B/axis-media/media.amp HTTP/1.1 x-sessioncookie: <ваш-код-сессии> Content-Type: application/x-rtsp-tunnelled
-
В теле запроса укажите команду RTSP, например,
PLAY
,PAUSE
и т.д. Убедитесь, что используете корректный формат.
-
-
Получите ответ на команду в первой сессии.
- Ответ на вашу команду будет возвращён в GET-сессии в виде RTP-данных, что и является потоком, который вы хотите получить.
-
Продолжайте отправлять команды через POST-сессию.
- После установления потока, задавайте команды продолжительно (например, для управления потоком) через POST, пока поток будет активен. Результат будет возвращён в GET-сессию.
Возможные Ошибки
-
Authorization: Если вы получаете ответ 200 с
Content-Type: application/x-rtsp-tunneled
, это, возможно, сигнализирует об отсутствии правильной авторизации. Необходимо убедиться, что вы точно копируете заголовки из успешного запроса Windows Media Player. -
Синтаксис запросов: Убедитесь, что ваш синтаксис запросов строго соответствует требованиям документации, включая корректное управление сессиями и заголовками.
-
Тестирование с помощью Fiddler: Убедитесь, что вы правильно настраиваете Fiddler для обработки RTSP-потоков, так как некоторые клиенты могут ожидать определённый порядок и тип запросов.
Заключение
Правильное управление RTSP over HTTP требует тщательной настройки сессий и заголовков. Если ваши запросы сформулированы согласно описанным шагам, вы должны получить поток RTSP корректно. Продолжайте отлаживать ваши запросы с использованием Wireshark для отслеживания взаимодействия с камерой и Fiddler для тестирования сессий.