【求助】怎么将blob 对象 用$.post()的方式传到node中

1.最近在尝试用node.js 做语音识别 用的是百度的api 现在碰到了解决不了的问题 录音的库 返回的是一个blob
我做了各个方面的尝试 我得需求是这样的 通过web录音然后获取到blob 对象 然后通过$.post()的方式将这个blob传入node中 然后再通过node写入一个wav的文件
2.$.post()中的data 不能传入对象
3.blob 序列化 通过fileReader 序列化后 过长
4.网上查到了一个blob-to-buffer 的库 要求传过来的是一个blob对象 所以现在希望最好是能直接将blob对象传到后台

代码如下:
后台创建的一个录音 blob对象

encodeWAV: function () {  
                var sampleRate = Math.min(this.inputSampleRate, this.outputSampleRate);  
                var sampleBits = Math.min(this.inputSampleBits, this.oututSampleBits);  
                var bytes = this.compress();  
                var dataLength = bytes.length * (sampleBits / 8);  
                var buffer = new ArrayBuffer(44 + dataLength);  
                var data = new DataView(buffer);  
  
                var channelCount = 1;//单声道  
                var offset = 0;  
  
                var writeString = function (str) {  
                    for (var i = 0; i < str.length; i++) {  
                        data.setUint8(offset + i, str.charCodeAt(i));  
                    }  
                }  
  
                // 资源交换文件标识符   
                writeString('RIFF'); offset += 4;  
                // 下个地址开始到文件尾总字节数,即文件大小-8   
                data.setUint32(offset, 36 + dataLength, true); offset += 4;  
                // WAV文件标志  
                writeString('WAVE'); offset += 4;  
                // 波形格式标志   
                writeString('fmt '); offset += 4;  
                // 过滤字节,一般为 0x10 = 16   
                data.setUint32(offset, 16, true); offset += 4;  
                // 格式类别 (PCM形式采样数据)   
                data.setUint16(offset, 1, true); offset += 2;  
                // 通道数   
                data.setUint16(offset, channelCount, true); offset += 2;  
                // 采样率,每秒样本数,表示每个通道的播放速度   
                data.setUint32(offset, sampleRate, true); offset += 4;  
                // 波形数据传输率 (每秒平均字节数) 单声道×每秒数据位数×每样本数据位/8   
                data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true); offset += 4;  
                // 快数据调整数 采样一次占用字节数 单声道×每样本的数据位数/8   
                data.setUint16(offset, channelCount * (sampleBits / 8), true); offset += 2;  
                // 每样本数据位数   
                data.setUint16(offset, sampleBits, true); offset += 2;  
                // 数据标识符   
                writeString('data'); offset += 4;  
                // 采样数据总数,即数据总大小-44   
                data.setUint32(offset, dataLength, true); offset += 4;  
                // 写入采样数据   
                if (sampleBits === 8) {  
                    for (var i = 0; i < bytes.length; i++, offset++) {  
                        var s = Math.max(-1, Math.min(1, bytes[i]));  
                        var val = s < 0 ? s * 0x8000 : s * 0x7FFF;  
                        val = parseInt(255 / (65535 / (val + 32768)));  
                        data.setInt8(offset, val, true);  
                    }  
                } else {  
                    for (var i = 0; i < bytes.length; i++, offset += 2) {  
                        var s = Math.max(-1, Math.min(1, bytes[i]));  
                        data.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);  
                    }  
                }  
  
                return new Blob([data], { type: 'audio/wav' });  
            }  
        };  

通过点击传后台

      $('#download').click(function(){

            var url = recorder.getBlob();
            console.log(url) //获取到blob
            //Blob {size: 44, type: "audio/wav"}
            console.log(JSON.stringify(url))//这样序列化 blob 直接变成空
              //{}
            
        //     var reader = new FileReader();
        //     reader.readAsText(url)
            
        // reader.onloadend = function(e) {
        //    var result = reader.result;
        //     $.post('yuyin',{voiceData:result},function(data){
        //         console.log(data)
        //     })
        //     console.log(result)
        // }
            // 上面这个方式过长
    $.post('yuyin',{voiceData:JSON.stringify(url)},function(data){
                console.log(data)
            })
       
     


     
    })
阅读 4.3k
1 个回答
var fd = new FormData();
fd.append('fname', 'test.wav');
fd.append('data', soundBlob);
$.ajax({
    type: 'POST',
    url: '/yuyin',
    data: fd,
    processData: false,
    contentType: false
}).done(function(data) {
      console.log(data);
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题