创建 Java 客户端应用程序以使用基本身份验证显示来自外部源的 hls 流

问题描述 投票:0回答:1

我正在尝试使用 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 清单,但是当我使用它检索片段时,浏览器要求我将它们保存在本地。

非常感谢。

spring spring-mvc media-player basic-authentication http-live-streaming
1个回答
0
投票

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 编码(用户名 + ‘:’ + 密码)放入页面中。

© www.soinside.com 2019 - 2024. All rights reserved.