ajax接收wav文件,【Web前端问题】ajax接收的pcm数据流转wav blob后在网页播放有符号的话就停止播放了...

我接收到pcm数据流转为wav blob后,这个blob在播放器可以正常播放,但是到浏览器audio标签内播放的时候如果这句话有符号就会停止播放

比如播放‘好好学习,天天向上’

在播放器里就会全部播放出来,但是到浏览器的audio就只播放天天向上,

这是怎么回事啊

这是代码

var addWavHeader = function(samples,sampleRateTmp,sampleBits,channelCount){

var dataLength = samples.byteLength;

var buffer = new ArrayBuffer(44 + dataLength);

var view = new DataView(buffer);

function writeString(view, offset, string){

for (var i = 0; i < string.length; i++){

view.setUint8(offset + i, string.charCodeAt(i));

}

}

var offset = 0;

/* 资源交换文件标识符 */

writeString(view, offset, 'RIFF'); offset += 4;

/* 下个地址开始到文件尾总字节数,即文件大小-8 */

view.setUint32(offset, /*32*/ 36 + dataLength, true); offset += 4;

/* WAV文件标志 */

writeString(view, offset, 'WAVE'); offset += 4;

/* 波形格式标志 */

writeString(view, offset, 'fmt '); offset += 4;

/* 过滤字节,一般为 0x10 = 16 */

view.setUint32(offset, 16, true); offset += 4;

/* 格式类别 (PCM形式采样数据) */

view.setUint16(offset, 1, true); offset += 2;

/* 通道数 */

view.setUint16(offset, channelCount, true); offset += 2;

/* 采样率,每秒样本数,表示每个通道的播放速度 */

view.setUint32(offset, sampleRateTmp, true); offset += 4;

/* 波形数据传输率 (每秒平均字节数) 通道数×每秒数据位数×每样本数据位/8 */

view.setUint32(offset, sampleRateTmp * channelCount * (sampleBits / 8), true); offset +=4;

/* 快数据调整数 采样一次占用字节数 通道数×每样本的数据位数/8 */

view.setUint16(offset, channelCount * (sampleBits / 8), true); offset += 2;

/* 每样本数据位数 */

view.setUint16(offset, sampleBits, true); offset += 2;

/* 数据标识符 */

writeString(view, offset, 'data'); offset += 4;

/* 采样数据总数,即数据总大小-44 */

view.setUint32(offset, dataLength, true); offset += 4;

function floatTo32BitPCM(output, offset, input){

input = new Int32Array(input);

for (var i = 0; i < input.length; i++, offset+=4){

output.setInt32(offset,input[i],true);

}

}

function floatTo16BitPCM(output, offset, input){

input = new Int16Array(input);

for (var i = 0; i < input.length; i++, offset+=2){

output.setInt16(offset,input[i],true);

}

}

function floatTo8BitPCM(output, offset, input){

input = new Int8Array(input);

for (var i = 0; i < input.length; i++, offset++){

output.setInt8(offset,input[i],true);

}

}

if(sampleBits == 16){

floatTo16BitPCM(view, 44, samples);

}else if(sampleBits == 8){

floatTo8BitPCM(view, 44, samples);

}else{

floatTo32BitPCM(view, 44, samples);

}

return view.buffer;

}

这是ajax请求的代码

var req = new XMLHttpRequest();

req.open("GET", `https://url/lasf/cloudtts?text=${textv}&user=${accountid}`, true); // grab our audio file

req.setRequestHeader('channel','cloudasr')

req.setRequestHeader('lenkey',lenkey)

req.setRequestHeader('secrkey',secrkey)

req.responseType = "arraybuffer"; // needs to be specific type to work

req.overrideMimeType('text/xml; charset = utf-8')

req.onload = function() {

console.log(req.response)

// if(this.status!=200){

// throw "pcm文件不存在/文件格式错误!";

// return;

// }

//根据pcm文件 填写 sampleRateTmp【采样率】(11025) 和sampleBits【采样精度】(16) channelCount【声道】(单声道1,双声道2)

var fileResult = addWavHeader(req.response,11025,16,1);

var blob = new Blob([fileResult], {type:'autio/wave'});

console.log(blob)

bgm.src = URL.createObjectURL(blob);

// if (callback) {

// callback(src);

// }

bgm.play();

pause.innerHTML = '暂停'

pauseImg.src='./images/pause.png'

};

req.send(null);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值