2

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

我想要做的是将专辑封面添加到将从前端下载的 mp3 文件中。

语境

我正在从 YouTube 下载视频流并使用fluent-ffmpeg.
要获取视频,我使用ytdlnpm 模块。

然后我将此流传输到前端。

我发现了什么

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

0 回答 0