我遇到了一点问题如果你能给我点建议我会很感激的。
- 我尝试为将从前端下载的mp3文件添加唱片集封面。**
上下文
我正在从YouTube下载视频流,并使用fluent-ffmpeg
将其转换为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);
});
1条答案
按热度按时间huwehgph1#
不幸的是,似乎没有可能的解决方案来完成这个任务与流。我已经研究了很多,但发现只有一个解释为什么我们不能这样做与FFmpeg和管道流。njoyard写道:
实际上这个问题并不是Windows特有的。大多数格式在文件的开头写入流信息(持续时间,比特率,关键帧位置...),因此ffmpeg只能在其输出可查找时才能写入此信息(因为它必须在知道要写入什么之前完成对流的处理)。管道是不可查找的,因此当使用输出管道时,您将无法获得此信息。
至于您关于输出格式的说明,ffmpeg从输出文件扩展名确定输出格式,这对于管道是不可能的;这就是为什么必须显式指定输出格式的原因。
这里有一个链接,可以自己找到它:https://github.com/fluent-ffmpeg/node-fluent-ffmpeg/issues/159
因此,我看到的唯一解决方案是使用saveToFile()方法保存文件并将其附加到响应。