Потоковое видео Rtsp с аутентификацией

#java #android #rtsp #android-videoview

#java #Android #rtsp #android-видеообзор

Вопрос:

Я пытаюсь подключиться к IP-камерам straming с IP-адресом. Я попытался подключиться с:

 rtsp://username:password@ip_camera
  

но просмотру видео это не нравится. Я пробовал с картой, подобной:

 Uri source = Uri.parse("rtsp://ipcamera");
headers = new HashMap<String, String>();
headers.put("Username", "user");
headers.put("Password", "password");
videoView.setVideoURI(source, headers);
  

все равно не работает. Итак, я прочитал в Интернете, что требуется базовая аутентификация base_64, поэтому:

 String authHeader = "Basic "   Base64.encodeToString("username:password".getBytes(),Base64.URL_SAFE | Base64.NO_WRAP);
headers.put("Authorization", authHeader);
Uri source = Uri.parse("rtsp://ipcamera");
videoView.setVideoURI(source, headers);
  

ничего. Та же ошибка

 E/MediaPlayerNative: error (1, -2147483648)
  

что это означает неизвестная ошибка (?)

Есть какие-нибудь советы по поиску рабочего метода? Спасибо

Редактировать

С помощью Chrome network analyze я обнаружил, что эта камера использует авторизацию с дайджестом. Это способ его создания?

Комментарии:

1. вы уверены, что ключ Username

2. Я не такой. Повторяю попытку с именем пользователя, те же результаты.

3. вы пробовали использовать этот URL в VLC Player

4. Да, URL, подобный rtsp://user:pass@ip работа

Ответ №1:

Библиотека, которую вы используете для потоковой передачи rtsp, должна поддерживать дайджест-аутентификацию.

Это не так просто, как добавить заголовок.

Дайджест аутентификации с помощью RTSP

RTSP-сервер с поддержкой дайджеста должен ответить на DESCRIBE запрос с помощью 401 unauthorized см. D.2.2, возвращая одноразовый номер в WWW-Authenticate заголовке, например

 WWW-Authenticate: Digest realm="GStreamer RTSP Server", nonce="1c91a068811f1029"
  

Затем клиент использует одноразовый номер для генерации заголовка авторизации, который может использоваться для аутентификации,

 Authorization: Digest username="admin", realm="GStreamer RTSP Server", nonce="1c91a068811f1029", uri="rtsp://0.0.0.0:8554/live.sdp", response="ef18317f111b1446dc4c6a11b4f4ebf3"
  

Указанное выше значение ответа генерируется снова для каждого запроса RTSP путем хэширования некоторой информации следующим образом

 HA1 = MD5(username:realm:password)
HA2 = MD5(method:digestURI)
response = MD5(HA1:nonce:HA2)
  

Комментарии:

1. Спасибо за ответ, я протестирую его завтра. Один вопрос: как я могу сгенерировать HA1 и HA2? Я импортировал spongy castle, но я не знаю, правильный ли это путь. Android studio предлагает следующую статическую строку: импортировать статический org.spongycastle.bcpg. HashAlgorithmTags.MD5;