尝试播放通知声音时状态 503

Status 503 when trying to play notification sound

我为我们公司创建了一个 PHP/Ajax WebChat。每当收到新消息时,它应该使用第一个答案中的方法播放通知声音。

How to play a notification sound on websites?

现在的问题是,当从任何普通计算机访问它时它工作正常,但是从(相当受限的)公司网络它在控制台中给我一个 "HTTP Status 503 Service Unavailable"。因为它在任何其他 Internet Access 上工作,所以这很奇怪。另外一点,我收到通知声音来自:https://notificationsounds.com/

如果从公司网络进入,有的声音播放有的不播放。刷新后,有效的声音与刷新前不同。就像它随机播放声音一样。注意:聊天服务器位于我家。

可能是什么问题,是否有任何一种不必使用其他 post 方法的变通方法?

这是我用来加载和播放通知声音的代码:

chat.playSound("the-calling");  

playSound : function (filename) {
    document.getElementById("sound").innerHTML=
       '<audio autoplay="autoplay">
            <source src="https://notificationsounds.com/soundfiles/a516a87cfcaef229b342c437fe2b95f7/file-sounds-1068-the-calling.wav" />
            <source src="https://notificationsounds.com/soundfiles/a516a87cfcaef229b342c437fe2b95f7/file-sounds-1068-the-calling.ogg" type="audio/ogg" />
            <embed hidden="true" autostart="true" loop="false" src="/sounds/' + filename  +'.mp3" />
        </audio>';
}

网站 http://notificationsounds.com 实际上并不是用来存放声音的;他们在每个声音上提供 "Download" link 以便您可以主持自己。他们的站点实际上可能无法扩展以满足您对其提出的需求,或者他们可能受到 IP 地址的限制。 当您每次想要播放声音时都会访问他们的网站,并且这可能会乘以您在聊天应用程序中拥有的并发用户数,这两种情况都会导致随机失败。

如果站点管理员注意到您公司的 public IP 地址导致此类问题,他们可能会选择阻止您公司的 IP 地址,让您完全无法发出声音。几年前我也发生过类似的事情,正因如此,我终于有机会见到我所在组织的副总裁,并在他的办公室度过 'quality time'。

所以,我推荐两件事:

1) 从他们的网站下载您想要的声音并将它们托管在您的网站上

2) 缓存音频的加载,这样您就不必重新加载它了。

我创建了一个缓存音频的演示(来自 http://notificationsounds.com):

var notification_sounds = {
    "breaking-glass" : "8f121ce07d74717e0b1f21d122e04521/file-4f_glass-beaking-2",
    "the-calling" : "a516a87cfcaef229b342c437fe2b95f7/file-sounds-1068-the-calling",
    "ringo" : "5737c6ec2e0716f3d8a7a5c4e0de0d9a/file-47_oringz-pack-nine-01"
};

function findOrCreateAudioPlayer(filename) {
    var sound = notification_sounds[filename] || notification_sounds['breaking-glass'];
    var player = $("#audio-" + filename);

    if (player.length == 0) {
  player = $("<audio />").attr("id", "audio-" + filename);
        $("<source />").attr("src", "https://notificationsounds.com/soundfiles/" + sound + ".mp3").appendTo(player);
        player.appendTo($("body"));
        $("<p />").text(filename).appendTo($("body"));
    }
    
    return player;
}

function playSound(filename) {
    findOrCreateAudioPlayer(filename);
    player = $("#audio-" + filename)[0];
    player.load();
    player.play();
}

var sounds = ["nothing", "the-calling", "ringo", "breaking-glass"];
var sound = sounds[Math.floor(Math.random()*sounds.length)]

playSound(sound);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

您也可以尝试 complete jsFiddle demo

设置好后,您可以通过调用 playSound(soundName) 播放您选择的任何声音(从声音列表中)。该演示会选择一种已注册的声音(和一种未注册的声音),并在您单击代码下方的 'Run code snippet' 按钮时播放该声音。

请注意,这不依赖于任何特定的 HTML 内容,但会根据需要创建它自己的 <audio> 元素,并在其中缓存内容。在此代码中,您会看到一旦声音被缓存,它就不会再次从源站点加载,直到您重新加载页面。

根据您的原始示例,您可以将 playSound 回调更改为:

playSound : function (filename) {
    playSound(filename);
}

稍微更改一下名称可能是明智的,以免造成混淆。