HTML5音频播放本地mp3文件

问题描述:

播放列表搜索一段时间如何使音频标签打从本地机器上一首歌曲之后,我发现这个解决方案(Play audio local file with html):HTML5音频播放本地mp3文件

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); 
    } 
}); 

和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> 

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

+0

输入元件可允许的多个文件的选择。你为什么想要这样做?如果文件保存在本地机器上,用户可以使用他们喜欢的任何媒体播放器播放它们,并拥有完全控制权 – ADyson

+0

这是一个在浏览器中创建播放器的有趣项目。我知道我可以从文件输入中选择多个文件,但是如何将这些文件添加到播放列表中? – Lamar

+0

我想你会得到一个数组中的选定文件的列表,并将音频控制的来源更改为下一个完成最后一个?有事件告诉你什么时候发生https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events – ADyson

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; 
 
    } 
 
});
<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>

+0

哇!这比FileReader容易得多。只是为了我的信息,我们是否仍然可以用FileReader来做到这一点,因为每次绑定目标结果时都会给我:音频标签中的src(未知)? – Lamar

+0

@Lamar它也可以。但也许它给你未知,因为它不能识别音频名称 – AvrilAlejandro

+1

谢谢,无论如何,我将它标记为解决方案,因为它看起来比FileReader轻。 – Lamar