使用 javascript 播放以 base64 编码的 .wav 声音文件

Posted

技术标签:

【中文标题】使用 javascript 播放以 base64 编码的 .wav 声音文件【英文标题】:play .wav sound file encoded in base64 with javascript 【发布时间】:2013-07-19 17:21:39 【问题描述】:

我可以通过以下方式使用 javascript 播放声音,

    var snd = new Audio('sound.wav');
    snd.play();

这会播放所需的声音,但有时加载速度很慢,甚至可能根本不加载 所以我用 base 64 对声音进行了编码,并尝试以这种方式播放。

      var splash = 
prefix: "data:audio/wav;base64,",
sound: [ "*base64 string here*" ] ;

    var snd = new Audio(splash); 
    snd.play();

但声音不播放,有什么办法吗?

【问题讨论】:

你现在做了什么?为什么要将音频编码为 base64 ! 为了让它播放得更快,我看到它是在一个插件中完成的,google fart scroll 在 2018 年,Chrome 似乎不支持这种方式播放 WAV。如果您snd.play().catch(err=>console.log(err)),您将看到:“NotSupportedError:该元素没有支持的来源。”我的解决方案是使用 mp3s 而不是 wavs。 @Fong-Kah-Chun 提供的链接,用于生成传递给 new Audio 的字符串,顺便说一句效果很好。 【参考方案1】:

这看起来不像为htmlAudioElement / <audio> 使用Audio 构造函数的正确方法。

微调

var snd = new Audio("data:audio/wav;base64," + base64string);
snd.play();

如果它在控制台中有效但在脚本中无效,则可能正在收集垃圾,在这种情况下,它会保持范围

var Sound = (function () 
    var df = document.createDocumentFragment();
    return function Sound(src) 
        var snd = new Audio(src);
        df.appendChild(snd); // keep in fragment until finished playing
        snd.addEventListener('ended', function () df.removeChild(snd););
        snd.play();
        return snd;
    
());
// then do it
var snd = Sound("data:audio/wav;base64," + base64string);

【讨论】:

感谢一百万 @paul s.,但你认为哪个加载更快,base64 或声音文件? @UDcreate 这取决于您的意思是“加载速度更快”。 base64 表示页面加载时间更长,具体取决于服务器的 ping 和声音文件大小可能比 page+ 更长初始加载的文件,因为base64占用更多空间,但是一旦页面加载,声音将立即可用。或者,如果您使用文件页面加载速度会更快,但可能会有延迟当您想要播放声音时,会从服务器获取声音。 @UDcreate 这取决于。 gzip 压缩后,base64 非常快。原始声音文件具有二进制格式,因此在开始时更加压缩。反正wav格式很大。除了性能测试,没有什么能告诉你真相。 @UDcreate 也,如果答案有帮助,请投票。如果某个答案解决了您的问题,请选择它作为解决方案,以便其他人知道问题已解决。 @Vasanth 在 2018 年,Chrome 似乎不支持以这种方式播放 WAV。如果你 snd.play().catch(err=>console.log(err)) 你会看到:“NotSupportedError: The element has no supported sources.”我的解决方案是使用 mp3s 而不是 wavs。【参考方案2】:
var snd = new Audio("data:audio/x-wav;base64, <URI data>");
snd.play();

不需要将splash声明为对象变量。

Base64 转换可以通过以下方式轻松完成: https://dopiaza.org/tools/datauri/index.php

【讨论】:

以上是关于使用 javascript 播放以 base64 编码的 .wav 声音文件的主要内容,如果未能解决你的问题,请参考以下文章

base64 编码的音乐文件只播放 6 秒

如何使用 bash 脚本从 base64 转换的文件中播放声音?

移动设备上的 HTML5 base64 编码音频

Base64 编码一个 javascript 对象

在 JavaScript 中调整 Base-64 图像的大小而不使用画布

C#函数播放base64编码的mp3文件