UNPKG

adpcm-addon

Version:

ADPCM编码解码插件

157 lines (128 loc) 6.04 kB
const fs = require('fs') const dgram = require('dgram') const adpcm = require('bindings')('adpcm.node'); const saveFile = "e:\\一首歌_decode.pcm" /** 开启UDP监听,并将收到的ADPCM数据进行解码保存成PCM文件 */ this._server = dgram.createSocket('udp4') this._server.on('error', (err) => { console.log('出错了。。。。。。。。。。。。。。。') console.log(err) }) this._server.on('message', (msg, rinfo) => { const numChannels = msg.readInt8(10) if (numChannels == 0) { const valprev = numChannels == 0 ? msg.readInt16LE(17, 2) : msg.readInt16LE(19, 2) const index = numChannels == 0 ? msg.readInt8(21) : msg.readInt8(22) const state = { valprev, index } const adpcmBuff = Buffer.copyBytesFrom(msg, 23) const input = Array.from(adpcmBuff) const output = [] adpcm.decode(input, output, state) // console.log(input) // console.log(output) // throw new Error("adsf1233412341234") // if (output.length != 252) { // throw new Error("adsf1233412341234") // } // console.log(output.length) const pcmData = new Int16Array(output) // throw new Error("adsf1233412341234") fs.writeFile(saveFile, pcmData, { flag: "a" }, (err) => { if (err) { console.log("###############################") console.log(err) } }) // throw new Error("ljalsdfjlasjdf") } else if (numChannels == 1) { // console.log(`------------------------------- ${numChannels}`) } else if (numChannels == 2) { // console.log(`=============================== ${numChannels}`) } else { console.log(`+++++++++++++++++++++++++++++++ ${numChannels}`) } }) this._server.on('listening', () => { if (fs.existsSync(saveFile)) { fs.rmSync(saveFile) } console.log('开始监听。。。。。。。。。。。。。。。。。') }) // this._server.bind(10000, "192.168.1.104") /** 读取PCM音频数据并压缩成ADPCM格式 */ fs.readFile("E:\\Doc\\项目\\宋艳民\\测试音频\\本地生成音频\\de_guo_zhan_che_16k.pcm", (err, data) => { const input = new Int16Array(data.buffer) console.log(`---------------------------- ${data.length} - ${input.length}`) const left = [] const right = [] for (let i = 0; i < input.length; i += 2) { left.push(input[i]) right.push(input[i + 1]) } const leftData = Array.from(left) const rightData = Array.from(right) let order = 10000 let frameCount = 0 const sl = { valprev: 0, index: 0 } const sr = { valprev: 0, index: 0 } while (leftData.length >= 252 && rightData.length >= 252) { /** 左右声道分包传输-左声道 */ // const aHead = Buffer.alloc(23) // aHead.writeIntLE(0x004D43504441, 0, 6) // aHead.writeInt32LE(order, 6, 4) // aHead.writeInt8(0, 10) // aHead.writeInt16LE(252, 11) // aHead.writeInt16LE(16000, 13) // aHead.writeInt16LE(16, 15) // aHead.writeInt16LE(sl.valprev, 17) // aHead.writeInt16LE(0, 19) // aHead.writeInt8(sl.index, 21) // aHead.writeInt8(0, 22) /** 左右声道分包传输-右声道 */ // const bHead = Buffer.alloc(23) // bHead.writeIntLE(0x004D43504441, 0, 6) // bHead.writeInt32LE(order, 6, 4) // bHead.writeInt8(1, 10) // bHead.writeInt16LE(252, 11) // bHead.writeInt16LE(16000, 13) // bHead.writeInt16LE(16, 15) // bHead.writeInt16LE(0, 17) // bHead.writeInt16LE(sr.valprev, 19) // bHead.writeInt8(0, 21) // bHead.writeInt8(sr.index, 22) /** 左右声道和包传输 */ const adpcmHead = Buffer.alloc(23) adpcmHead.writeIntLE(0x004D43504441, 0, 6) adpcmHead.writeInt32LE(order, 6) adpcmHead.writeInt8(2, 10) adpcmHead.writeInt16LE(252, 11) adpcmHead.writeInt16LE(16000, 13) adpcmHead.writeInt16LE(16, 15) adpcmHead.writeInt16LE(sl.valprev, 17) adpcmHead.writeInt16LE(sr.valprev, 19) adpcmHead.writeInt8(sl.index, 21) adpcmHead.writeInt8(sr.index, 22) const a = leftData.splice(0, 252) const output = [] adpcm.encode(a, output, sl) const b = rightData.splice(0, 252) const output2 = [] adpcm.encode(b, output2, sr) /** 左右声道分包保存 */ // fs.writeFileSync("E:\\Doc\\项目\\宋艳民\\测试音频\\本地生成音频\\德国战车_16k_分包", aHead, { flag: "a" }) // fs.writeFileSync("E:\\Doc\\项目\\宋艳民\\测试音频\\本地生成音频\\德国战车_16k_分包", Buffer.from(output), { flag: "a" }) // fs.writeFileSync("E:\\Doc\\项目\\宋艳民\\测试音频\\本地生成音频\\德国战车_16k_分包", bHead, { flag: "a" }) // fs.writeFileSync("E:\\Doc\\项目\\宋艳民\\测试音频\\本地生成音频\\德国战车_16k_分包", Buffer.from(output2), { flag: "a" }) // order += 1 /** 左右声道和包保存 */ fs.writeFileSync("E:\\Doc\\项目\\宋艳民\\测试音频\\本地生成音频\\德国战车_16k_和包", adpcmHead, { flag: "a" }) fs.writeFileSync("E:\\Doc\\项目\\宋艳民\\测试音频\\本地生成音频\\德国战车_16k_和包", Buffer.from(output), { flag: "a" }) fs.writeFileSync("E:\\Doc\\项目\\宋艳民\\测试音频\\本地生成音频\\德国战车_16k_和包", Buffer.from(output2), { flag: "a" }) frameCount += 1 if (frameCount > 2000) { console.log(`---------------------------- ${frameCount}`) throw new Error("enough") } } console.log(`================================ ${frameCount}`) })