我遇到了一点问题,希望能得到一些见解。
我想要做的是为从前端下载的mp3文件添加专辑封面。
背景
我正在使用fluent-ffmpeg
从YouTube下载视频流并将其转换为mp3格式。
我使用ytdl
npm模块来获取视频。
然后我将此流式传输到前端。
我发现的问题
fluent-ffmpeg
提供pipe()
或saveToFile()
两种方法。
我发现当我使用saveToFile()
函数,并将流保存到mp3文件中时,它有效,我确实得到了专辑封面。
但是当我将流传送到前端甚至写入文件时,歌曲会被正确保存到文件中,但没有专辑封面。
这是我的代码
后端(NodeJS)
let video = ytdl(`http://youtube.com/watch?v=${videoId}`, {
filter: (format) => format.container === 'mp4' && format.audioEncoding,
quality: 'lowest'
});
let stream = new FFmpeg()
.input(video)
.addInput(`https://i.ytimg.com/vi/${videoId}/default.jpg`)
.outputOptions([
'-map 0:1',
'-map 1:0',
'-c copy',
'-c:a libmp3lame',
'-id3v2_version 3',
'-metadata:s:v title="Album cover"',
'-metadata:s:v comment="Cover (front)"'
])
.format('mp3');
然后将其传送到我的前端。
stream.pipe(res);
stream
.on('end', () => {
console.log('******* Stream end *******');
res.end.bind(res);
})
.on('error', (err) => {
console.log('ERR', err);
res.status(500).end.bind(res);
});
前端(React)
axios.get(url)
.then(res => {
axios(`${url}/download`, {
method: 'GET',
responseType: 'blob'
})
.then(stream => {
const file = new Blob(
[stream.data],
{ type: 'audio/mpeg' });
//Build a URL from the file
const fileURL = URL.createObjectURL(file);
})
.catch(err => {
console.log('ERROR', err);
});
})
.catch(err => {
console.log('ERROR', err);
});