我正在尝试连接到具有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网络分析,我发现此相机使用了摘要授权。那是生成它的方法吗?
答案 0 :(得分:0)
用于流rtsp的库必须支持摘要身份验证。
这不像添加标题那么简单。
已启用摘要的RTSP服务器应使用DESCRIBE
See D.2.2来响应401 unauthorized
请求,并在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)