我正在尝试使用 spring mvc 开发一个简单的 java webapp,它访问一个像代理一样工作的外部 HLS 服务器,并且流式传输的不仅仅是实时视频。 外部服务器(rtsp-simple-server,这里是感兴趣的人的 github 页面:https://github.com/aler9/mediamtx)仅启用了 HLS 协议,并且可以从 url 访问服务的每个源流: https://mediaserver.url:port/stream1, https://mediaserver.url:port/stream2, 等等... 流受 HTTP 基本身份验证保护。 我的网络应用程序部署在我的本地机器上,需要访问流,从后端执行身份验证并显示在网页中检索到的视频。 对于流媒体部分,在前端,我使用流媒体客户端 hls.js。 我的网页看起来像这样:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
html, body {
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
}
#video {
width: 50%;
height: 50%;
background: black;
}
</style>
</head>
<body>
<video id="video" muted controls autoplay playsinline></video>
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<script>
const create = () => {
const video = document.getElementById('video');
var videoSrc = 'https://mediaserver.url:port/stream1/stream.m3u8';
// always prefer hls.js over native HLS.
// this is because some Android versions support native HLS
// but don't support fMP4s.
if (Hls.isSupported()) {
const hls = new Hls();
hls.on(Hls.Events.ERROR, (evt, data) => {
if (data.fatal) {
hls.destroy();
setTimeout(create, 2000);
}
});
hls.loadSource(videoSrc);
hls.attachMedia(video);
video.play();
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
// since it's not possible to detect timeout errors in iOS,
// wait for the playlist to be available before starting the stream
fetch(videoSrc)
.then(() => {
video.src = videoSrc;
video.play();
});
}
};
window.addEventListener('DOMContentLoaded', create);
</script>
</body>
</html>
Spring有没有办法从后端注入基本身份验证标头,以便hls客户端只需要调用流并将其显示在页面中,这样登录弹出窗口就不会出现,我也不需要在网页的流式 URL 中写入凭据?
我试过用webfilter,也试过用spring对象RestTemplate。 在最后一个中,我设法检索了 m3u8 清单,但是当我使用它检索片段时,浏览器要求我将它们保存在本地。
非常感谢。
Basic auth 只是简单地在 http 请求中添加以下形式的标头
将此标头添加到提取中是简单。
fetch(videoSrc,
{
headers: {
"Authorization": "Basic " + Base64encoded(username + ‘:’ + password)
})
.then(() => {
video.src = videoSrc;
video.play();
});
然而,将其添加到 hls.js 调用中看起来更困难。使用身份验证基本标头,而不是 id 和令牌。
通过您在 springboot 中使用的 Java 页面渲染器(Thymeleaf、JSP、outputStream)将 Base64 编码(用户名 + ‘:’ + 密码)放入页面中。