У меня есть аудиоэлемент HTML, воспроизводящий файл MP3, и моя цель — плавно перевести его в другой файл MP3 с помощью vanilla JS или jQuery. Другими словами, я хочу, чтобы новый трек постепенно исчезал, в то время как старый трек все еще исчезает. Замена src мгновенно изменит песню, а не постепенно их затухнет, так что это было бы нецелесообразно.
Одно решение, которое я нашел, заключается в использовании двух аудиоэлементов, один из которых будет служить «резервной копией», содержащей новую песню. Когда я хочу их перенести, я постепенно уменьшаю громкость текущей дорожки и увеличиваю громкость резервной копии:
var currentTrack = $('#currentSong')
var backupTrack = $('#newSong')
currentTrack.animate({volume: 0}, 1000) //Fade out the current song
backupTrack[0].load()
backupTrack.animate({volume: 1}, 1000) //Fade in new song
backupTrack[0].play()
Хотя это работает, это кажется немного хакерским, особенно если я хочу применить это к нескольким аудиоэлементам. Мне интересно, есть ли более эффективный способ сделать это, не удваивая количество аудиоэлементов на странице.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


К сожалению, нет возможности сделать это надежно и точно с аудиоэлементами. Для этого необходимо использовать Web Audio API.
Вы можете передать оба аудиоэлемента в API веб-аудио с MediaElementAudioSourceNode для каждого. Это, по крайней мере, позволит вам планировать точные фейды с помощью GainNode. Однако время воспроизведения звука каждый раз будет немного отличаться.
Использование AudioBufferSourceNode вместо аудиоэлемента для воспроизведения даст лучшие результаты. Однако для этого требуется, чтобы все аудио были загружены заранее.