Node.js将Mp3流式传输到http而无需保存文件

时间:2014-04-27 23:54:51

标签: javascript node.js http ffmpeg mp3

我正在尝试将来自youtube链接的音频直接传输到带有node.js的http。

我的代码看起来像这样,我使用快递4.0。

var express = require('express');
var router = express.Router();
var ytdl = require('ytdl');
var ffmpeg = require('fluent-ffmpeg');
var fs = require('fs');

router.get('/', function(req, res) {

  var url = 'https://www.youtube.com/watch?v=GgcHlZsOgQo';
  var video = ytdl(url)

  res.set({
      "Content-Type": "audio/mpeg"
  })

  new ffmpeg({source: video})
      .toFormat('mp3')
      .writeToStream(res, function(data, err) {
        if (err) console.log(err)
      })

});

module.exports = router;

现在,我可以将视频的音频流式传输到响应中,如果我保存文件然后将其传输到响应,但我宁愿尝试找出一些方法去从下载到ffmpeg到响应。

不确定这是否可行。主要目标是尽可能保持轻量级,而不必从文件中读取。

我已经看过this代码,这基本上是我想做的,减去了对文件部分的保存。

part of the error

1 个答案:

答案 0 :(得分:0)

  

由于res是流,ffmpeg也是流。   
  我们用.pipe()互相传送。


使用管道流数据

使用管道不需要将文件保存在ROM中。数据存储在RAM中,并在需要时进行访问。这是一种非常有效的流文件方式!

router.get('/', function(req, res) {
  var url = 'https://www.youtube.com/watch?v=GgcHlZsOgQo';

  // Audio format header (OPTIONAL)
  res.set({ "Content-Type": "audio/mpeg" });

  // Send compressed audio mp3 data
  ffmpeg()
  .input(ytdl(url))
  .toFormat('mp3')
  .pipe(res);
});