通过Node.js传输音频文件

通过Node.js传输音频文件,node.js,audio,stream,mp3,torrent,Node.js,Audio,Stream,Mp3,Torrent,我正在使用node.js创建一个可读的下载音频文件流。我已经通过管道将其传输到我的目录中的一个音频文件中 我的问题是,如何在node.js中传输此音频文件。是否有一些标准方法可以在文件下载时播放该文件?我不知道有什么方法可以在音频文件下载时播放,但以下是一些代码,可能适用于您尝试执行的操作: var http = require('http'), fs = require('fs'), filePath = 'myfile.mp3', stat = fs.statSy

我正在使用node.js创建一个可读的下载音频文件流。我已经通过管道将其传输到我的目录中的一个音频文件中


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

我不知道有什么方法可以在音频文件下载时播放,但以下是一些代码,可能适用于您尝试执行的操作:

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

希望这有帮助

我不知道如何在下载音频文件时播放该文件,但这里有一些代码可能适用于您正在尝试执行的操作:

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

希望这有帮助

我试过这个,它似乎有效:

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
}

我试过了,它似乎很管用:

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
}