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

Mar*_*eca 5 html5 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">
Run Code Online (Sandbox Code Playgroud)

这工作正常,但现在我只需要保护经过身份验证的用户的后端路由。为此,我只需要在请求标头中添加身份验证令牌。问题是,根据为<img />标签发出的请求设置自定义标头,img标签不接受标头参数。因此,现在我尝试使用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)

    })
  }
Run Code Online (Sandbox Code Playgroud)

我得到的只是以下警告: 警告:提供的值“ stream”不是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")
Run Code Online (Sandbox Code Playgroud)

A. *_*arr 0

我建议在视频的查询参数中发送某种身份验证令牌,并为了处理此问题,实现一个自定义令牌身份验证类,该类从查询参数而不是标头获取令牌。然后,您必须authentication_classes使用新的身份验证类更新视图的属性。