我遇到了一个问题,如果能获得一些见解,我将不胜感激。
我要做的是将专辑封面添加到将从前端下载的mp3文件中。
我正在从YouTube下载视频流,并使用fluent-ffmpeg
将其转换为mp3。
要获取视频,我使用ytdl
npm模块。
然后我将此流通过管道传输到前端。
fluent-ffmpeg
提供pipe()
或saveToFile()
。
我想到的是,当我使用saveToFile()
函数并将流实际上保存到mp3文件中时,它确实有效,我确实得到了专辑封面。
但是当我将流传输到前端甚至文件时,歌曲会正确保存到文件中,但没有专辑封面。
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);
});