跨浏览器 HTML5 音频播放器

Posted

技术标签:

【中文标题】跨浏览器 HTML5 音频播放器【英文标题】:Cross-browser HTML5 audio player 【发布时间】:2021-03-03 09:18:57 【问题描述】:

我正在使用audio 标签播放wav 音频,我的网址由URL.createObjectURL() 生成,网址类似于blob:http://localhost/9fa2ef06-ade6-4027-89f8-06cd2c176405

由于 url 没有扩展名,我对 safari 有一些问题

以下代码适用于 chrome,不适用于 safari(音频播放器已禁用)

<audio src="MY_BLOB_URL" type="audio/wav">
</audio>

以下代码适用于 safari,不适用于 chrome

<audio controls>
  <source src="MY_BLOB_URL" type="audio/wav">
</audio>

我尝试了如下奇怪的代码,但找不到在两种浏览器上都可以使用的方法

<audio src="MY_BLOB_URL" type="audio/wav">
  <source src="MY_BLOB_URL" type="audio/wav">
</audio>

这里有什么问题?以及如何使用单个代码拥有跨浏览器的 html5 音频播放器?

【问题讨论】:

javascript 在哪里? Safari 工作代码(第二个示例)是我用来在 Chrome 中播放音频的设置,但我使用 JS 来更新 &lt;source&gt; 标签的 .src。你有一个 JS 函数来做URL.createObjectURL() 吗?如果是,为什么不通过相同的功能更新&lt;source&gt; 我拥有的是代码,因为简单来说,我在问题中使用 MY_BLOB_URL 占位符作为URL.createObjectURL 的结果 我能想到的获取 blob 的最快示例是通过文件浏览,我将编写这样的示例代码,然后您可以测试它是否有用。我在 Windows PC 上,所以无法测试 Safari。 【参考方案1】:

我已经使用 Chrome、Edge 和 Firefox 在 Windows PC 上测试了以下代码。 希望它也适用于 Safari。

PS:对于未来的读者,此代码也适用于 MP3 blob(设置为 accept=".mp3")。

<!DOCTYPE html>
<html><head> <meta content="text/html;charset=utf-8" http-equiv="Content-Type"> </head>

<body>

<div style="z-index: 1; overflow:hidden; position: absolute; top: 100px; left: 50px">
<audio id="tag_Audio1" controls>
<source type="audio/wav">
</audio>
</div>

<br><br><br><br>

<div style="z-index: 1; overflow:hidden; position: absolute; top: 10px; left: 50px">
<p> Choose an WAV file...</p>
<input type="file" id="choose_media" accept=".wav" />
</div>

<script>

var file; var reader;
var tmpElement; //# is reference to aTag for holding image content.
var file_Blob; //# is reference to file BLOB (data of selected file).

const  myAudio = document.getElementById("tag_Audio1");
document.getElementById("choose_media").addEventListener("change", onFile_Selected, false);

function onFile_Selected(evt) 

    file = evt.target.files[0]; //# access to selected file
    
    reader = new FileReader();
    reader.readAsDataURL(file); //# load selected file as Blob
    reader.addEventListener("loadend", onFile_Loaded, false);


function onFile_Loaded(evt) 

    if (evt.target.readyState == FileReader.DONE) 
    
        //# remove any current SRC
        myAudio.removeAttribute("src");
        
        //# create blob
        file_Blob = (window.URL || window.webkitURL).createObjectURL(file);
        
        //# apply blob & test play
        myAudio.setAttribute("src", file_Blob);
        myAudio.load();
        myAudio.play();
       


</script>

</body>
</html>

【讨论】:

以上是关于跨浏览器 HTML5 音频播放器的主要内容,如果未能解决你的问题,请参考以下文章

是否可以设置 html5 音频标签的样式?

HTML5 音频加载和播放无法在 iPad 上运行

HTML5 音频播放器未在 ios Safari 中自动播放

HTML5 音频未在 Android 4.0.4 设备本机浏览器中多次播放

跨浏览器音频支持(无 Flash)

<audio> 标签的可定制且跨浏览器友好的音频播放器 [关闭]