管道Firebase流以HPE_INVALID_CONSTANT表示响应结果



我正在尝试将视频(mp4)从firebase存储流式传输到客户端的<video>。我所做的是使用createReadStream和管道来表达响应对象。但是在客户端会抛出以下错误:

代理错误:Could not Proxy request/movie/600d31f192e0941f9c4b4773/stream from localhost:3000 to http://localhost:5000/。[1]参见https://nodejs.org/api/errors.html#errors_common_system_errors获取更多信息(HPE_INVALID_CONSTANT)。

const streamMovie = async (req, res) => {
const range = req.headers.range
const movie = await Movie.findById(req.params.id)
const bucket = firebase.storage().bucket()
// Get video size
const videoFile = bucket.file(movie.videoFileUrl)
const [metadata] = await videoFile.getMetadata()
const videoSize = metadata.size
// Parse range
const parts = range.replace('bytes=', '').split('-')
const start = parseInt(parts[0], 10)
const end = parts[1] ? parseInt(parts[1], 10) : videoSize - 1
res.writeHead(206, {
'Content-Type': 'video/mp4',
'Content-Range': `bytes ${start}-${end}/${videoSize}`,
'Content-Length': `${end - start + 1}`,
'Accept-Ranges': 'bytes',
})
videoFile.createReadStream({ start, end }).pipe(res)
}

我无法确定错误的来源,因为我对流相当缺乏经验。任何帮助都是感激的。谢谢!

如果要将视频文件流式传输到express response对象,可以使用客户端库官方文档中的代码示例。我已经成功地测试了以下示例:

const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
const bucket = storage.bucket('bucket123');
const remoteFile = bucket.file('videotest123.mp4');
res.writeHead(200, {
'Content-Type': 'video/mp4',
'Content-Range': 'bytes=0-',
'Accept-Ranges': 'bytes',
})
remoteFile.createReadStream()
.on('error', function(err) {
res.send('there was an error');
})
.on('response', function(response) {})
.on('end', function() {})
.pipe(res);  
})
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`)
})

如果你只想请求视频的某些部分(又名谷歌云存储对象),你可以在createReadStream方法中指定startend选项。

const remoteFile = bucket.file('videotest123');
logFile.createReadStream({
start: 10000,
end: 20000
})
.on('error', function(err) {})
.pipe(res);

关于HPE_INVALID_CONSTANT消息,我在这里发现该消息表明web服务器响应格式错误。在本例中是代码中的res对象。

我希望你觉得这有用。

最新更新