拼接 Buffer 生成 mp3文件,可能由于编码问题造成的丢失.
发布于 6 年前 作者 TongDaDa 3352 次浏览 来自 问答
    Promise.all([this.translateEnglishPronounce(sentence), baiduAudioCompond(sentence_translate)]).then(async (res) = {
                        if (!res) { throw TypeError("To makes audio that the type not have response.") }
                        const [senAudioBuf, SenTraAudioBuf] = res;
                        const isEndSentence = i === maxSentenceNum - 1;
                        sentences = Buffer.concat([sentences, senAudioBuf, SenTraAudioBuf])

                        fs.writeFileSync(path.join(__dirname,"word.mp3"), senAudioBuf); 
                        fs.writeFileSync(path.join(__dirname,"trans.mp3"), SenTraAudioBuf);

                        decodeToAudioBuff(Buffer.concat([SenTraAudioBuf, senAudioBuf])).then((audioBuff) => {
                            fs.writeFileSync(path.join(__dirname,"ttt.mp3"), audioBuff );
                        })

上面代码是请求google(word.mp3)和百度(trans.mp3)的语音接口他们都返回 mp3/mpeg 格式的数据,我单独存储两个接口返回的数据为mp3文件时,单独播放都是有正确内容的.

可问题是,使用 Buffer.concat 拼接两个buffer出现了文件大小叠加上去,但是播放出来的却只有Google的接口的声音(ttt.mp3)。令我百思不得其解啊。我需要怎样转换这里的编码?

8 回复

一般人我不告诉他

@zengming00 您好,您也遇到过这种情况嘛

https://en.wikipedia.org/wiki/MP3 去了解一下mp3的file structure。

@luckyScript 结构看一下,不知道如何从buffer转换到mp3。

很多文件的拼接不是直接加一起就OK的
比如一些文件的结构是这样的:文件头-内容-结束符
两个文件直接拼一起就会变成 文件头-内容-结束符-文件头-内容-结束符
这样的话读到第一个文件的结束符就会认为结束了

@dislido 哦,谢谢

@TongDaDa 请问问题你解决了吗

可以用16进制编辑器对比分析一下

[CNodeMD]

回到顶部