源于数据url(base64)的音频标签在播放音频之前不会完全加载



我有一个应用程序,它在运行时动态地将音频片段加载到音频标记中。它通过将音频转换为base64数据url并将其分配给标记的src属性来实现这一点。

问题是音频标签直到音频片段完全播放一次之后才处理数据。这个问题在标签上显示为(1(音频长度不足,(2(时间洗涤器禁用,(3(3点图标不显示。第一次播放音频片段后,这些功能将立即出现。

我需要一种方法来获得音频标签,以便在分配音频片段后立即对其进行处理。用户需要能够下载音频并使用时间洗涤器快进,而不必被迫播放整个音频片段。

我已经广泛搜索了这个问题的解决方案。我已经尝试过audioTag.preload = "auto";,并在分配src后调用audioTag.load();。我还让它静置了15分钟,以防它加载缓慢。

我对使用base64数据url格式的替代方案持开放态度,如果它允许我绕过这个问题的话。

感谢您提供的任何帮助。

编辑:我在Chrome 80和Firefox 75中看到了这个问题。

编辑:我正在生成一个音频剪辑,并通过两种方式将其分配给音频标签:(1(来自"文件"输入标签(2(来自MediaRecorder(连接到web音频api(。

以下是"文件"输入标签加载:

const reader = new FileReader();
reader.onload = () =>
{
const audioTag = document.getElementById("audioTag");
audioTag.preload = "auto";
audioTag.src = reader.result;
audioTag.load();
};
reader.readAsDataURL(fileInputTag.files[0]);

这是MediaRecorder加载:

mediaRecorder.onstop = () =>
{
const blob = new Blob(audioChunks, {type : "audio/wav"});
let reader = new FileReader();
reader.onload = () =>
{
let audioTag = document.getElementById("rec");
audioTag.preload = "auto";
audioTag.src = reader.result;
audioTag.load();
};
reader.readAsDataURL(blob);
};

我刚刚确定,打开一个用大胆创建的wav文件效果很好。此问题仅在打开从MediaRecorder保存的音频文件时显示。

我已经确定MediaRecorder实际上是在生成"webM/opus"文件,而不是"wav"文件。研究强烈表明,"webM"是MediaRecorder在chrome上唯一可用的录制选项(firefox也允许"ogg"(。不支持"wav"文件。我现在要发布一个"解决方案"。

我已经确定这个问题涉及到我使用MediaRecorder生成音频片段,然后将音频片段保存到文件中。音频实际上是"webm/opus"格式的。MediaRecorder不支持"wav"或"ogg"(至少在chrome中是这样(。无论如何,MediaRecorder创建的剪辑是不可查找的,只有在完全播放完至少一次后才能删除或下载,正如本chromium bug中所讨论的那样。

我将寻找另一种录制音频的方式,因为MediaRecorder目前不足以满足我的需求,原因是(1(剪辑不美观(2(格式不兼容。

最新更新