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

new9mtju  于 2023-01-01  发布在  Node.js
关注(0)|答案(1)|浏览(290)

我遇到了一点问题如果你能给我点建议我会很感激的。

    • 我尝试为将从前端下载的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);
    });
huwehgph

huwehgph1#

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

相关问题