我遇到了一些问题,如果我能得到一些见解,我将不胜感激。
我想要做的是将专辑封面添加到将从前端下载的 mp3 文件中。
语境
我正在从 YouTube 下载视频流并使用fluent-ffmpeg
.
要获取视频,我使用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);
});
前端(反应)
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);
});