206 部分内容请求中的 Content-Range 和 Content-Length 不正确

我有一个 Html 音频标签,其中 src 设置为使用 WebAudio Api 记录的 wav 文件的 Blob Url。当寻找音频的不同部分时,206 Partial Content 响应标头填充了不正确的 Content-Length 和 Content-Range。

如果我有一个大约 5 秒的音频剪辑,它的长度为 483,371 字节并在音频元素上寻求 2.4 秒,我会看到请求填充了内容长度/范围,如果我寻求 4.8 秒(或加倍我想要的)。


我得到了什么:

内容长度:24620

内容范围:字节 458752-483371/483372

内容类型:音频/wav


我应该得到什么:

内容长度:232019

内容范围:字节 251353-483371/483372

内容类型:音频/wav


如果我寻求超过一半的音频长度,我的音频不会播放并且播放器被发送回 0。如果我寻求 5 秒剪辑的 1 秒,它将获得音频的最后 3 秒,直观地显示它从 1 秒播放到 4 秒,然后停止播放(因为出于某种原因将字节范围的起始位置加倍,我得到的是 2-5 秒而不是 1-5 秒的字节。)

我正在 google chrome 中调试,有没有其他人遇到过这个问题或者对它可能是什么有任何想法?使用正确的响应标头编写我自己的 GET 请求会更容易吗?

想法:这是一个单声道.wav文件,它可能是在计算双声道.wav文件的开始时间吗?

页面上没有其他音频元素,因此不会受到任何干扰。

我应该去哪里调试或覆盖这个 206 部分内容请求?


慕哥9229398
浏览 626回答 2
2回答

莫回无

所以,一段时间后我重新审视了这个,因为我正在重做我的项目中需要单声道音频的部分,而且我对这个奇怪的问题做了噩梦。结果发现 Recorder.js 中存在一个错误,该错误会弄乱单声道录音的编码。在 recorder.js 的 EncodeWav 函数中,我不得不更改 line view.setUint32(28, sampleRate * 4, true); 到 view.setUint32(28, sampleRate * numChannels * 2, true);这使得音频文件的搜索变得完美,允许我将文件大小减半,并使我不必在路上将其更改为单声道。function encodeWAV(samples) {var buffer = new ArrayBuffer(44 + samples.length * 2);var view = new DataView(buffer);var numChannels = 1;var sampleRate = 18000;/* RIFF identifier */writeString(view, 0, 'RIFF');/* RIFF chunk length */view.setUint32(4, 36 + samples.length * 2, true);/* RIFF type */writeString(view, 8, 'WAVE');/* format chunk identifier */writeString(view, 12, 'fmt ');/* format chunk length */view.setUint32(16, 16, true);/* sample format (raw) */view.setUint16(20, 1, true);/* channel count */view.setUint16(22, numChannels, true);/* sample rate */view.setUint32(24, sampleRate, true);/* byte rate (sample rate * block align) *///view.setUint32(28, sampleRate * 4, true);view.setUint32(28, sampleRate * numChannels * 2, true);/* block align (channel count * bytes per sample) */view.setUint16(32, numChannels * 2, true);/* bits per sample */view.setUint16(34, 16, true);/* data chunk identifier */writeString(view, 36, 'data');/* data chunk length */view.setUint32(40, samples.length * 2, true);floatTo16BitPCM(view, 44, samples);return view;}

慕沐林林

更新:这是因为它是一个单通道 WAV 文件。将录音更改为双通道后,播放效果很好。我最初这样做是为了减小文件大小,因此为了补偿我在双通道中录制并将采样率从 48000 降低到 18000。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript