通过 Node.js 流式传输音频文件
Streaming an Audio File over Node.js
我正在使用 node.js 和 torrent-stream 创建下载音频文件的可读流。我已经将它通过管道传输到我目录中的一个音频文件中。
我的问题是,如何在 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);
希望对您有所帮助!
我试过了,似乎有效:
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
}
我正在使用 node.js 和 torrent-stream 创建下载音频文件的可读流。我已经将它通过管道传输到我目录中的一个音频文件中。
我的问题是,如何在 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);
希望对您有所帮助!
我试过了,似乎有效:
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
}