Аудио файлов в различные форматы с помощью JavaScript


Я использую следующий код для воспроизведения звукового файла:

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>
Таким образом, в основном вместо установки audio.src мне нужно будет добавить <source> элементы к объекту Audio. Но как мне это сделать? Есть что-нибудь вроде new Source() в javascript, что мне нужно использовать здесь, что я могу как-то добавить к audio?

Бонусный вопрос: если браузер не поддерживает ни один из предложенных исходных форматов, могу ли я каким-то образом выполнить какой-то пользовательский код, например, напечатать сообщение пользователю, сказав, что их браузер отстой? :)

1 3

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' },
])