JavaScript 播放上传的音频

IT技术 javascript file-upload media
2021-02-27 10:27:53

如何制作,以便在上传音频时可以播放?我使用了这段代码,但是没有用。

<input type="file" id="audio" onchange="playFile(this)" />
<audio id="sound"></audio>
<script type="text/javascript">
    function playFile(obj){
        var url=document.getElementById("audio").url;
        document.getElementById("sound").src=url;
        document.getElementById("sound").play()
    }
</script>
3个回答

[编辑]

不应使用 FileReader API 将用户选择的文件加载到其页面中。

相反,人们应该更喜欢这种URL.createObjectURL(File)方法。
这将返回一个 blobURI,只能从用户会话访问,在用户 File 的情况下,它只是指向原始文件的直接指针,因此在内存中几乎没有任何内容。

input.onchange = function(e){
  var sound = document.getElementById('sound');
  sound.src = URL.createObjectURL(this.files[0]);
  // not really needed in this exact case, but since it is really important in other cases,
  // don't forget to revoke the blobURI when you don't need it
  sound.onend = function(e) {
    URL.revokeObjectURL(this.src);
  }
}
<input type="file" id="input"/>
<audio id="sound" controls></audio>

[上一个答案]

您无法访问本地文件的完整 url input type="file"

但是,由于文件 API,您可以读取文件

input.onchange = function(){
  var sound = document.getElementById('sound');
  var reader = new FileReader();
  reader.onload = function(e) {
    sound.src = this.result;
    sound.controls = true;
    sound.play();
    };
  reader.readAsDataURL(this.files[0]);
}
<input type="file" id="input"/>
<audio id="sound"></audio>

正如我在评论中提到的,有几件事会阻止您的方法起作用。

这是一个处理图像、视频和声音的简单示例。

<!DOCTYPE html>
<html>
<head>
<script>
"use strict";
function byId(e){return document.getElementById(e);}

window.addEventListener('load', onDocLoaded, false);

function onDocLoaded()
{
    byId('mFileInput').addEventListener('change', onChosenFileChange, false);
}

function onChosenFileChange(evt)
{
    var fileType = this.files[0].type;

    if (fileType.indexOf('audio') != -1)
        loadFileObject(this.files[0], onSoundLoaded);

    else if (fileType.indexOf('image') != -1)
        loadFileObject(this.files[0], onImageLoaded);

    else if (fileType.indexOf('video') != -1)
        loadFileObject(this.files[0], onVideoLoaded);
}

function loadFileObject(fileObj, loadedCallback)
{
    var reader = new FileReader();
    reader.onload = loadedCallback;
    reader.readAsDataURL( fileObj );
}

function onSoundLoaded(evt)
{
    byId('sound').src = evt.target.result;
    byId('sound').play();
}

function onImageLoaded(evt)
{
    byId('image').src = evt.target.result;
}

function onVideoLoaded(evt)
{
    byId('video').src = evt.target.result;
    byId('video').play();
}

</script>
<style>
</style>
</head>
<body>
    <input type="file" id="mFileInput"/>
    <br>
    <audio id="sound"></audio>
    <img id='image'/>
    <video id='video'/>
</body>
</html>

function handleFiles(event) {
	var files = event.target.files;
	$("#audio").attr("src", URL.createObjectURL(files[0]));
	$("#player")[0].load();
    $("#player")[0].play();
}

document.getElementById("file").addEventListener("change", handleFiles, false);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="file" />
<audio id="player" controls>
  <source src="" id="audio" />
</audio>

这与@Kaiido 投票最多的答案几乎相同,但使用的是 Jquery。此外,您必须.load();在播放之前使用加载音频。所以这段代码的作用是你可以上传任何音频文件,它会自动开始播放。谢谢!