【问题标题】:How do I send headers while setting audio src?如何在设置音频 src 时发送标头?
【发布时间】:2021-03-22 20:06:40
【问题描述】:

我正在尝试使用 html5 音频标签播放音频文件。

很好玩……

但由于某种原因,要求浏览器为源发出请求,必须包含浏览器(在我的情况下为 safari)未添加的特定标头。 (我看到 chrome 添加了)

标头为:Accept-encoding: gzip

我怎样才能做到这一点?

我不想事先下载整个文件...我想要音频标签来处理它,带有一个新的标题。

document.getElementById("audio").load();
document.getElementById("audio").play();
<audio id="audio" src="https://upload.wikimedia.org/wikipedia/commons/transcoded/7/7b/FurElise.ogg/FurElise.ogg.mp3"> <audio>
    

再一次,当这段代码运行时,我只想修改为此发出的每个请求的标头...

注意

当您添加源并加载到 chrome 中时,浏览器会发出“范围请求”,要求媒体文件的后续部分,以便它可以在一些数据可用时立即开始播放,但是,我的 CDN using 要求这些请求具有此特定标头,问题在于 chrome 中此标头是由 chrome 本身添加的,而在 safari 中则不是,因此我想拦截浏览器在媒体元素上调用 load() 时发出的这些请求并添加标题。 我不想在付款前下载整个文件,我知道这行得通,但这违背了目的。

【问题讨论】:

  • 你尝试了什么?错误信息是什么?
  • 我尝试了什么?我将 src 添加到音频标签,这就是我尝试过的!我不知道如何为我问的音频标签设置自定义标头,错误消息是什么?没有错误,问题是寻找一种方法来实现我不知道的事情,我已经阅读了一些人们说不可能的答案
  • @ceving 我想你很困惑,我不是自己发出任何请求,当我调用 load() 时浏览器正在这样做,我想拦截它来修改它!
  • 一个问题需要minimal reproducible example。对于 MCVE,它是相关的,它可以工作。否则无法重现。
  • @cerving 好的,我会记住的,感谢您编辑问题!

标签: javascript html5-video html5-audio akamai


【解决方案1】:

既然您想要做的是加载然后播放,那么如何将您的请求与XMLHttpRequest 样式模式结合起来,使用类似fetch 的东西?

喜欢:

HTML

<!-- just an indicator, in case the file is large -->
<div id="loading"><em>File is loading. Please wait...</em></div>

<!-- initially hide the audio tag. Also, change the 'src' to 'data-src' so it doesn't automatically load -->
<audio id="audio" style="display: none;" data-src="https://upload.wikimedia.org/wikipedia/commons/transcoded/7/7b/FurElise.ogg/FurElise.ogg.mp3" controls></audio>

Javascript

// define variables
  var audioEl = document.getElementById("audio");
  function fetchAudioFile() {
    // go get the file
    var requestObj = new Request(audioEl.dataset.src, {
        method: 'GET',
        headers: {
          'Accept-encoding': 'gzip'   // add your header(s)
        },
        referrerPolicy: 'no-referrer'
    });

    fetch(requestObj).then(function(response) {
      return response;
    }).then(async function(outcome) {
      const blob = await outcome.blob();
      // convert our blob to a url that can be used by the audio tag
      const url = window.URL.createObjectURL(blob);
      // replace the source
      audioEl.src = url;
      // hide the helpful text
      document.getElementById("loading").style["display"] = "none";
      // show the audio tag
      audioEl.style["display"] = "block";
      // play it immediately
      audioEl.play();
    });
  };

// get the file
  fetchAudioFile();

希望这会有所帮助。请注意,根据浏览器的不同,有时音频可能不会自动播放,除非用户首先与页面交互或明确授予权限。

【讨论】:

  • 我不想在播放前下载整个文件。
  • 当您添加源并加载到 chrome 中时,浏览器会发出“范围请求”,要求媒体文件的后续部分,以便它可以在一些数据可用时立即开始播放,但是,我正在使用的 CDN 要求这些请求具有这个特定的标头,问题是在 chrome 中这个标头是由 chrome 本身添加的,而在 safari 中它不是,因此我想拦截浏览器在我调用 load 时发出的这些请求( ) 在媒体元素上并添加标题,希望您现在得到更清晰的图片...
  • 好的 - 我看到你已经在你原来的问题中添加了这个澄清。?? 我认为(目前)没有办法“拦截”这些请求,IMO 最好控制获取自己(因此,无论浏览器如何,请确保行为是您想要的)。如果您不想在播放前下载整个文件,您仍然可以将我上面的答案改编成一个可以在“管道”输入时加载和播放的流。请参阅此处了解一些想法:developer.mozilla.org/en-US/docs/Web/API/Body/arrayBuffer
猜你喜欢
  • 2018-08-11
  • 2014-08-23
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 2014-12-19
  • 2013-04-06
相关资源
最近更新 更多