如何使用FFmpeg将专辑封面添加到mp3流中?

时间:2018-08-06 10:50:21

标签: javascript node.js ffmpeg mp3 fluent-ffmpeg

我遇到了一个问题,如果能获得一些见解,我将不胜感激。

我要做的是将专辑封面添加到将从前端下载的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);
  });

前端(反应)

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);
    });

0 个答案:

没有答案