【发布时间】:2021-04-22 07:43:59
【问题描述】:
我正在尝试创建一个保护最少的 HTML5 播放器以避免音乐下载。
快速解释:
- 我有一个数据库,其中包含标题、用于查找我的音乐的哈希。
- 在我的 HTML 文件中,我的按钮在属性中包含我的哈希值。
- 所以我通过 JS 检索我的哈希,然后我发出 AJAX 请求,该请求将 MP3 文件作为 Blob 返回。
通过音频文件的直接 URL 的音频正常功能允许预加载,但即使缓冲区未完成,也可以进行播放。 但是这里为了防止下载我必须使用 AJAX 请求。问题是它会下载完整的文件,然后创建 Blob 并开始播放。
但问题是,如果我的用户连接不佳并且文件大约 10 MB(加载大约 10-15 秒)
所以我希望我的用户能够在没有完成下载整个音乐的情况下开始收听,但只需要前 20% 就可以开始播放音频文件。
这是执行 AJAX 查询的代码,它将在我的播放器中加载博客响应。
var request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'blob';
request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
// Decode asynchronously
request.onload = function ()
{
if (request.readyState === 2)
{
const url = window.URL.createObjectURL(request.response);
audio.src = url;
audio.play();
document.body.removeChild(div);
}
else
{
alert('Impossible de lire cet music.');
}
}
request.send();
这里是AJAX调用的页面代码
$res 包含音乐数据。为了能够从服务器获取文件。
if ($res)
{
// TODO auto extension
$filename = '../mp3/' . $res['title'] . $res['track_extension'];
$fsize = filesize($filename);
$handle = fopen($filename, "rb", false, $context);
$contents = fread($handle, $fsize);
fclose($handle);
header('content-type: audio/mpeg');
header('Content-Length: ' . $fsize);
echo readfile($filename);
}
else
{
header('HTTP/1.0 404 Not Found', 404);
echo '0';
}
【问题讨论】:
标签: javascript php ajax html5-audio audio-streaming