拼接 Buffer 生成 mp3文件,可能由于编码问题造成的丢失.
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]