adpcm-addon
Version:
ADPCM编码解码插件
157 lines (128 loc) • 6.04 kB
JavaScript
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}`)
})