html - 如何使用 axios 向 img html 标签发出视频流 http GET 请求?

标签 html stream django-rest-framework axios vue-cli-3

我有一个 Django 2.1 后端,它有一个视频流端点和一个 Vue-Cli3 作为我的前端。 我后端的视频流端点是一个 GET 请求。要让流媒体在我的客户端工作,我只需要添加:

<img :src="$store.state.domain + 'cameras/video/' + camera.properties.name + '/'" width="240" alt="Camera live Stream">

这工作正常,但现在我必须只为经过身份验证的用户保护我的后端路由。为此,我只需要在请求 header 中添加一个身份验证 token 。 问题是,根据 Set custom header for the request made from <img/> tag , img 标签不接受 header 参数。 所以现在我正在尝试使用 axios 库构建请求,然后将请求结果流式传输到我的 HTML img 标记。 到目前为止我的 Vue 方法代码:

  loadStream(){
    const vm = this
    let accessToken = vm.$store.getters.getAccessToken
    let streamURL = `${vm.$store.state.domain}/cameras/video/${vm.camera.properties.name}/`

    axios.get(streamURL, {headers: {"Authorization": `Bearer ${accessToken}`},
                          responseType: 'stream', 
                          adapter: httpAdapter}


    ).then( response =>{

      console.log(`success:${response.data}`)

      let imgTag = document.createElement('img')
      imgTag.src = URL.createObjectURL(response)
      imgTag.classList.add('video-modal', 'popup-video')
      imgTag.alt = `Camera ${camera.properties.name} liveStream`
      imgTag.setAttribute("crossorigin", '')
      let streamDiv = document.getElementById('livestream-img')
      streamDiv.appendChild(imgTag)

    }).catch( error => {
      console.log(`error:${response.data}`)

      let imgTag = document.createElement('img')
      imgTag.alt = `Camera ${camera.properties.name} liveStream`
      let streamDiv = document.getElementById('livestream-img')
      streamDiv.appendChild(imgTag)

    })
  }

我得到的只是这个警告: Warning: The provided value 'stream' is not a valid enum value of type XMLHttpRequestResponseType.

而且我的请求永无止境。 Promise 永远不会命中 .then() 或 .catch() 因为它正在流式传输。似乎 responseType 无法正常工作。我错过了什么吗?

这是我的 django 后端端点:

class CameraVideoStreamingView(APIView):

    def get(self, request, name):

        cam = Camera.objects.get(name=name)
        return StreamingHttpResponse(cam.serve_web_stream(),
                                     content_type="multipart/x-mixed-replace;boundary=frame")

最佳答案

我建议在视频的查询参数中发送某种身份验证 token ,并为处理此问题,实现自定义 Token Authentication Class它从查询参数而不是 header 获取 token 。然后,您必须使用新的身份验证类更新 View 的 authentication_classes 属性。

关于html - 如何使用 axios 向 img html 标签发出视频流 http GET 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52975955/

相关文章:

html - 右滚动条导致文本在显示时缩小

javascript - 将嵌套的 ul li 转换为 json

ruby - 是否可以有多个 STDIN 流?

ios - 如何在 iOS 中使用 AVPlayer 缓冲音频?

mysql - Django:汇集 MySQL 数据库连接

python - 在 Django 中使用 JSONField 的默认字典列表

javascript - For 循环不适用于 JavaScript 动画

javascript - 在 ie11 企业上 Bootstrap

c# - 可扩展的套接字事件队列处理

python - 如何只允许更新1个字段?