账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    ajax接收的pcm数据流转wav blob后在网页播放有符号的话就停止播放了
    35
    0

    我接收到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);
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 染指流年 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部