HTML5 音频播放本地 mp3 文件的播放列表

Lam*_*mar 0 html javascript audio

在搜索了一段时间如何制作音频标签以从本地机器播放歌曲后,我找到了这个解决方案(使用 html 播放音频本地文件):

var $audio = $('#myAudio');
$('input').on('change', function(e) {
  var target = e.currentTarget;
  var file = target.files[0];
  var reader = new FileReader();

  console.log($audio[0]);
   if (target.files && file) {
        var reader = new FileReader();
        reader.onload = function (e) {
            $audio.attr('src', e.target.result);
            $audio.play();
        }
        reader.readAsDataURL(file);
    }
});
Run Code Online (Sandbox Code Playgroud)

和 html:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file">
<audio controls id="myAudio" autoplay></audio>
Run Code Online (Sandbox Code Playgroud)

上面的代码对于一个文件看起来不错。问题是有没有一种好方法可以从输入加载多个文件以使音频像播放列表一样播放它们,而无需同时创建多个 FileReader 实例?类似于首先将文件存储在数组中,然后从该数组中输入 src 或音频。

ale*_*rio 5

createObjectURL而不是new FileReader()

var songs = document.getElementById("songs"),
    myAudio = document.getElementById("myAudio");
function next(n){
  var url = URL.createObjectURL(files[n]);
  myAudio.setAttribute('src', url);
  myAudio.play();
}
var _next = 0,
    files,
    len;
songs.addEventListener('change', function() {
  files = songs.files;
  len = files.length;
  if(len){
    next(_next);
  }
});
myAudio.addEventListener("ended", function(){
   _next += 1;
   next(_next);
   console.log(len, _next);
   if((len-1)==_next){
     _next=-1;
   }
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="songs" multiple>
<audio controls id="myAudio" autoplay></audio>
Run Code Online (Sandbox Code Playgroud)