Javascript 206部分内容请求中的内容范围和内容长度不正确
我有一个Html音频标签,其中src设置为一个用WebAudioAPI记录的wav文件的BLOBURL。当寻找音频的不同部分时,206部分内容响应头填充了不正确的内容长度和内容范围 如果我有一个约5秒的音频剪辑,长度为483371字节,并在音频元素上搜索到2.4秒,我会看到请求中填充了内容长度/范围,如果我搜索到4.8秒(或两倍于我搜索的长度/范围)Javascript 206部分内容请求中的内容范围和内容长度不正确,javascript,html,blob,html5-audio,web-audio-api,Javascript,Html,Blob,Html5 Audio,Web Audio Api,我有一个Html音频标签,其中src设置为一个用WebAudioAPI记录的wav文件的BLOBURL。当寻找音频的不同部分时,206部分内容响应头填充了不正确的内容长度和内容范围 如果我有一个约5秒的音频剪辑,长度为483371字节,并在音频元素上搜索到2.4秒,我会看到请求中填充了内容长度/范围,如果我搜索到4.8秒(或两倍于我搜索的长度/范围) 我得到的是: 内容长度:24620 内容范围:字节458752-483371/483372 内容类型:音频/wav 我应该得到的是: 内容长度
我得到的是: 内容长度:24620 内容范围:字节458752-483371/483372 内容类型:音频/wav
我应该得到的是: 内容长度:232019 内容范围:字节251353-483371/483372 内容类型:音频/wav
如果我试图超过一半的音频长度,我的音频不会播放,播放器会被发送回0。如果我尝试5秒剪辑的1秒,它将获得音频的最后3秒,直观地显示它从1秒播放到4秒,然后停止播放(因为出于某种原因,它是字节范围起始位置的两倍,我得到的字节是2-5秒,而不是1-5秒。) 我正在谷歌chrome中调试,是否有其他人遇到过这个问题,或者对它可能是什么有任何想法?用正确的响应头编写自己的GET请求会更容易吗 想法: 这是一个单通道.Wav文件,它可能正在计算双通道.Wav文件的开始时间吗 页面上没有其他音频元素,因此不会产生任何干扰
我将在哪里调试或覆盖此206部分内容请求?更新:这是因为它是一个单通道WAV文件。将录制更改为双通道后,播放效果良好。我最初这样做是为了减小文件大小,所以为了补偿,我在双通道中记录,并将采样率从48000降低到18000 所以,过了一段时间,我又重新审视了这个问题,因为我正在重做我的项目中需要单声道音频的一部分,我对这个奇怪的问题做了噩梦。原来Recorder.js中有一个错误,它会扰乱单声道录制的编码。在recorder.js的EncodeWav函数中,我必须更改行 视图设置32(28,采样器*4,真); 到 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;
}
干得好,这也太疯狂了。