Я пытаюсь подключиться к стриминговым IP-камерам с 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 я обнаружил, что эта камера использует дайджест-авторизацию. Это способ его генерировать?
Я не. Tring с именем пользователя, те же результаты.
вы пробовали этот URL в VLC Player
Да, URL вида rtsp://user:pass@ip работает
Библиотека, которую вы используете для потоковой передачи 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)
Спасибо за ответ, завтра проверю. Один вопрос: как мне сгенерировать HA1 и HA2? Я импортировал губчатый замок, но не знаю, правильный ли это путь. Студия Android предлагает следующую статическую строку: import static org.spongycastle.bcpg.HashAlgorithmTags.MD5;
ты уверен что ключ
Username