java - 带有身份验证的 Rtsp 视频流
问题描述
我正在尝试使用 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 发现这台相机使用了摘要授权。那是一种生成方式吗?
解决方案
您用于流式传输 rtsp 的库必须支持摘要身份验证。
它不像添加标题那么简单。
使用 RTSP 进行摘要式身份验证
启用摘要的 RTSP 服务器应使用See D.2.2响应DESCRIBE
请求,在标头中返回随机数,例如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)
推荐阅读
- html - 我怎样才能让一个div占据全身高度
- java - HashMap / ArrayList 每个键不会取多个值
- django - 自定义 Django 身份验证时出现密码错误
- mediawiki - Mediawiki中上传文件的可编程自动重命名?
- javascript - addEventListener 返回未定义
- c++ - 比较两张地图,看看其中一张是否是子集
- graphql - 如何将架构字段类型显式设置为 [SanityImage]
- java - 从 kafka 消费者向服务发出 100 万个单独的 http 请求是个好主意吗?
- python - 如何将插件添加到远程 webdriver
- apache - 从非 https www 到 https www 发生的多个 URL 重定向