【问题标题】:How to ajax load, and verify, an mp3 file over a network, without playing it?如何通过网络 ajax 加载和验证 mp3 文件而不播放它?
【发布时间】:2019-04-21 23:24:52
【问题描述】:

我们的软件(主要用于学校)和防火墙存在很多问题:我们在资源范围内使用 mp3,而 mp3 在许多学校防火墙中被阻止。我正在尝试编写一些 js 代码来检测何时发生这种情况,因此我们可以提醒用户(教师)与他们的 IT 部门交谈并解除阻塞。

我最初尝试播放一段无声的短mp3,并检测是否发生了这种情况。但是,你必须跳这么多圈才能自动播放音频,尤其是在 iOS Safari 上 - 等待用户交互等,以至于跳圈的东西只是妨碍了测试,并使代码认为 mp3 是当它们实际上只是被浏览器而不是网络阻止播放时被阻止。

所以,我放弃了播放 mp3 的想法。我想做的是通过网络请求一个小的 mp3 文件,然后分析响应的内容,以确保它实际上是一个 mp3 文件,而不是一个 html 页面,上面写着“对不起,那个内容被阻止”,或者当有人请求被阻止的文件时防火墙可能返回的任何其他内容。

我实际上想不出最简单的方法是什么,它可以跨浏览器工作。我正在使用 jQuery,我认为我可以在 jQuery ajax 调用的“成功”块中做一些事情,分析我返回的数据,检查它是否是一个 mp3 文件。

我想到的第一件事就是将数据拉到页面上的一个 div 中,如下所示:

var url = "/assets/test_media_files/silence.mp3?t="+Math.random();
$("#content-test-file-data").load(url, function(){
  console.log("loaded data");
});

这是有效的,我在#content-test-file-data div 中有大量二进制数据乱码。但是,我怎么知道这是否是一个 mp3 文件呢?有没有更好的方法来做到这一点?我是否需要请求具有 mime 类型或类似类型的数据?谢谢

【问题讨论】:

  • 您是否尝试过使用小测试文件创建和预加载 <audio> 元素并在其上使用错误处理程序?
  • @charlietfl 是的,这就是真正浪费时间的原因,尝试使用音频标签。我无法分辨浏览器阻止和网络阻止之间的区别。
  • @gaetanoM 看起来很有趣,谢谢。我会担心,因为该测试使用 HEAD 请求,可能存在 HEAD 请求可以通过防火墙的情况,而 GET 会被阻止。如果是这样,那么 HEAD 请求就不是一个好的测试。
  • 你是对的,但另一种可能性是寻找 ....magic 标志(文件类型).....

标签: javascript jquery ajax mp3 binaryfiles


【解决方案1】:

您自己制作这个 mp3?将 ID3 标记添加到测试文件并读取它。由于它位于文件的末尾(128 字节),因此可以确定文件已完全到达。 ID3 org

第二种方法是读取/解码帧头(如here 所做的那样),但与第一种方法相比,它要复杂得多。

【讨论】:

  • 谢谢 - 在提出问题和刚刚看到您的答案之间,这(第一件事)正是我所做的。我制作了一个非常小的 mp3(只有一个音频数据点),并在元数据中放入了一个唯一的字符串作为标题。然后,我 ajax 加载文件并将其内容写入页面上的隐藏 div。二进制部分是乱码,但元数据值是可读文本,所以这只是检查 div 是否包含我的唯一字符串的情况。似乎工作完美。我会将其标记为正确,因为这是我最终使用的方法。谢谢
猜你喜欢
  • 2011-03-17
  • 1970-01-01
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多