【问题标题】:Rtsp video streaming with authentication带有身份验证的 Rtsp 视频流
【发布时间】:2019-08-18 03:39:12
【问题描述】:

我正在尝试使用 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 发现这台相机使用了摘要授权。那是一种生成方式吗?

【问题讨论】:

  • 你确定key是Username
  • 我不是。使用用户名进行搜索,结果相同。
  • 你在 VLC 播放器中试过这个网址吗
  • 是的,像 rtsp://user:pass@ip 这样的 url 工作

标签: java android rtsp android-videoview


【解决方案1】:

您用于流式传输 rtsp 的库必须支持摘要式身份验证。

不是加个header那么简单。

使用 RTSP 进行摘要式身份验证

启用摘要的 RTSP 服务器应使用 401 unauthorized See D.2.2 响应 DESCRIBE 请求,并在 WWW-Authenticate 标头中返回随机数,例如

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

客户端然后使用nonce生成可用于认证的授权头,

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 Studio 建议使用以下静态字符串:import static org.spongycastle.bcpg.HashAlgorithmTags.MD5;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 2018-01-24
  • 2020-12-25
  • 1970-01-01
相关资源
最近更新 更多