通过Node.js流式传输音频文件

时间:2017-02-20 01:23:38

标签: node.js audio stream mp3 torrent

我使用node.js和torrent-stream创建下载音频文件的可读流。我已经将它传输到我的目录中的音频文件中。

我的问题是,如何在node.js中传输此音频文件。下载时是否有一些标准的文件播放方式?

2 个答案:

答案 0 :(得分:1)

我尝试了这个,似乎有效:

const http = require('http')
const util = require('util')
const mime = require('mime')
const PORT = process.env.PORT || 8080
const onFinished = require('on-finished')
const parseRange = require('range-parser')
const torrentStream = require('torrent-stream')
const engine = torrentStream('magnet:?xt=urn:btih:b42f85d4d976f31d9edde30a101c79928e1353f6')

engine.on('ready', (files) => {
  http.createServer(function (req, res) {
    const index = parseInt(req.url.slice(1), 10)
    if (!files.hasOwnProperty(index)) return res.end()
    const file = files[index || 0]
    console.log(`${file.name} ${req.headers.range ? req.headers.range : ''}`)
    send(req, res, file)
  }).listen(PORT, function () { console.log('Server listening on: http://localhost:%s', PORT) })
})

function send (req, res, file) {
  let stream
  let len = file.length
  const type = mime.lookup(file.path)
  if (type) {
    const charset = mime.charsets.lookup(type)
    res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : ''))
  }
  res.setHeader('Content-Length', len)
  res.setHeader('Accept-Ranges', 'bytes')
  if (req.headers.range) {
    const ranges = parseRange(len, req.headers.range, { combine: true })
    if (ranges === -1) {
      res.setHeader('Content-Length', 0)
      res.setHeader('Content-Range', contentRange('bytes', len))
      res.statusCode = 416
      return res.end()
    }
    if (ranges !== -2 && ranges.length === 1) {
      res.statusCode = 206
      res.setHeader('Content-Range', contentRange('bytes', len, ranges[0]))
      len = ranges[0].end - ranges[0].start + 1
      res.setHeader('Content-Length', len)
      if (req.method === 'HEAD') return res.end()
      stream = file.createReadStream(ranges[0])
    }
  } else {
    if (req.method === 'HEAD') return res.end()
    stream = file.createReadStream()
  }
  onFinished(res, () => stream && stream.destroy())
  stream.pipe(res)
  return stream
}

function contentRange (type, size, range) {
  return type + ' ' + (range ? range.start + '-' + range.end : '*') + '/' + size
}

答案 1 :(得分:0)

我不知道在下载时播放音频文件的方法,但这里有一些代码可能适用于您要执行的操作:

var http = require('http'),
    fs   = require('fs'),
    filePath = 'myfile.mp3',
    stat = fs.statSync(filePath);

http.createServer(function(request, response) {

    response.writeHead(200, {
        'Content-Type': 'audio/mpeg',
        'Content-Length': stat.size
    });

    fs.createReadStream(filePath).pipe(response);
})
.listen(2000);

希望这有帮助!