如何使用FFmpeg为mp3流添加专辑封面?

3

我遇到了一点问题,希望能得到一些见解。

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

背景

我正在使用fluent-ffmpeg从YouTube下载视频流并将其转换为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个回答

0
很遗憾,似乎没有可能使用流完成此任务。我进行了大量研究,但只找到了一个关于为什么无法使用FFmpeg和管道流来完成此任务的解释。njoyard写道:
“实际上,这个问题不是特定于Windows的。大多数格式在文件开头写入流信息(持续时间、比特率、关键帧位置等),因此ffmpeg只能在其输出可寻址时(因为它必须在知道要写什么之前完成处理流到结尾)写入此信息。管道是不可寻址的,因此在使用输出管道时将无法获得此信息。”
“至于您关于输出格式的注释,ffmpeg从输出文件扩展名确定输出格式,这在管道中是不可能的;这就是为什么您必须明确指定输出格式的原因。”
这里有一个链接,可以让您自己查看:https://github.com/fluent-ffmpeg/node-fluent-ffmpeg/issues/159 所以,我唯一看到的解决方案是使用saveToFile()方法保存文件并将其附加到响应中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接