为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥9229398 2021-09-04 17:39:26
我有一个 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 部分内容请求?
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

所以,一段时间后我重新审视了这个,因为我正在重做我的项目中需要单声道音频的部分,而且我对这个奇怪的问题做了噩梦。结果发现 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;

}



查看完整回答
反对 回复 2021-09-04
?
慕沐林林

TA贡献2016条经验 获得超9个赞

更新:这是因为它是一个单通道 WAV 文件。将录音更改为双通道后,播放效果很好。我最初这样做是为了减小文件大小,因此为了补偿我在双通道中录制并将采样率从 48000 降低到 18000。


查看完整回答
反对 回复 2021-09-04
  • 2 回答
  • 0 关注
  • 623 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信