【问题标题】:Offer Audio file in different formats with javascript使用 javascript 提供不同格式的音频文件
【发布时间】:2018-09-12 07:40:53
【问题描述】:

我正在使用以下代码播放声音文件:

var audio = new Audio();
audio.src = 'somePath/filename.ogg';
audio.volume = 10;
audio.autoPlay = false;
audio.preLoad = true;
// ...
audio.play();

而且效果很好。但是,有些浏览器可能不支持 ogg 格式,所以我也想添加 mp3 格式作为替代。我怎么能用 javascript 做到这一点呢?

作为参考,当您提供多种格式时,这就是纯 HTML5 中的外观:

<audio volume="10" preload="auto">
  <source src="filename.ogg" type="audio/ogg">
  <source src="filename.mp3" type="audio/mpeg">
</audio>

所以,基本上我需要将&lt;source&gt; 元素添加到Audio 对象,而不是设置audio.src。我该怎么做呢? javascript中是否有类似new Source()的东西我需要在这里使用,我可以以某种方式添加到audio

额外问题:如果浏览器不支持所提供的任何源格式,我能否以某种方式执行一些自定义代码,例如向用户打印一条消息,说他们的浏览器很糟糕? :)

【问题讨论】:

  • 如果浏览器是旧的,和video标签一样,你可以使用“Your browser does not support the audio element”。 .只需在来源下添加该行
  • new Audio(src) 真的只是Object.assign(document.createElement('audio'), {src:src, autoplay:true});。所以不,没有 Source 构造函数,但基本的 DOM 方法可以。
  • 谢谢你,@Kaiido。我认为Audio 'object' 背后还有更多魔力。
  • 对于不支持来源的检测,这里已经介绍过:stackoverflow.com/questions/32430280/…

标签: javascript html html5-audio


【解决方案1】:

也许不完全是您的想法,但是您可以通过 DOM API 实现这一点?

// Create audio instance with different source times by means of the DOM API
function createAudio(sourceData) {

  const audio = document.createElement('audio')
  // audio.preload = 'auto', Redundant as source children are dynamically created
  audio.volume = 10
  audio.style.display = 'none'

  // Iterate each sourceInfo of input sourceData array
  for(var sourceInfo of sourceData) {

    const source = document.createElement('source')
    source.src = sourceInfo.src
    source.type = sourceInfo.type

    // Append each source to audio instance
    audio.appendChild(source)
  }

  document.appendChild(audio)

  // Update, forgot this - thanks @Kaiido!
  audio.load()

  return audio
}

// Usage
createAudio([
  { src : 'filename.ogg', type : 'audio/ogg' },
  { src : 'filename.mp3', type : 'audio/mpeg' },
])

【讨论】:

  • 缺少一点:您需要调用 MediaElement#load 以便它尝试解析其内部资源。
  • 看到您进行了明确的audio.load() 呼叫,这是否意味着预加载不适用于具有多个来源的音频?
  • @user2015253 不适用于由脚本生成的那些(或者也许你们中的某些人确实将其附加到文档中?)但最好自己调用它。
  • @user2015253 必须显式调用load(),因为source 子元素是动态指定的。所以从技术上讲,preload = auto 在这里是多余的
  • @user2015253 即使是 MDN(它比 W3School 更可靠,因为由社区维护,尽管它的名字,所有供应商工作人员)都没有自己的页面对于这种方法。您可以在this page though 找到摘录。但它所做的基本工作是触发"load algorithm",这与使用 preload=auto 得到的基本相同。请注意,这是调用“资源选择算法”的算法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多