首页 > 解决方案 > Discord.JS 录音和数据压缩

问题描述

我目前正在制作一个具有“用户记录”功能的 Discord 机器人,我正在 VC 中对其进行测试,并且注意到.pcm13 分钟后输出文件约为 20GB。

        this.voiceChannel = await message.member.voice.channel.join()
        this.reciever = this.voiceChannel.receiver
        this.voiceChannel.on('debug', (debug) => {
            let packet = JSON.parse(debug.slice(8))
            console.log(packet.op)

            if(!packet.d || packet.d && packet.d.speaking != 1) return;
            let user = this.client.users.resolve(packet.d.user_id)
            if(packet.d.speaking) {
                let userStream = this.reciever.createStream(user, {mode: 'pcm', end: 'manual'})
                let writeStream = require('fs').createWriteStream('./recording.pcm', {})
                this.us = userStream
                this.ws = writeStream

                this.us.on("data", (chunk) =>{
                    console.log(chunk)
                    this.us.pipe(this.ws)
                })
                this.ws.on("pipe", console.log)
            }
        })

有什么办法可以将.pcm文件从..我不知道,从 20GB 压缩到 5-10 MB?这似乎很奇怪,因为Buffer来自 Discord.js 的每个字节都高达 4000 字节 (4KB)(这也使我的磁盘上限为 100%,写入速度为 60MB/s)

标签: javascriptnode.jsdiscord.js

解决方案


我将回答我自己的问题,但我相信我知道我做错了什么。

this.us.on("data", (chunk) =>{
    console.log(chunk)
    this.us.pipe(this.ws)
})

我在那个部分是不正确的,因为每当收到数据时我都会发送数据,不是一次,而是两次。我还使用了该zlib模块(https://npmjs.org/package/zlib),它对数据/语音压缩的帮助更大。

this.us.on("data", (chunk) => {
    let slowBuf = this.zlib.deflate(chunk, (er, res) => {
        console.log(res)
        this.ws.write(res)
    })
})

这就像一个魅力,现在每 2 分钟左右的测试写入 600KB 的数据。


推荐阅读