【发布时间】:2022-01-26 11:32:11
【问题描述】:
我一直在开发这个网站:https://mirobod-tumani.vercel.app。主页上有视频背景。为了优化初始负载,我优化了视频本身并决定将其流式传输。 这是代码:
// pages/api/video
import fs from 'fs'
export default function handler(req, res) {
if (req.method === 'GET') {
const range = req.headers.range
const videoPath = 'public/assets/mirobod.webm'
const videoSize = fs.statSync(videoPath).size
const chunkSize = 1 * 1e6
const start = Number(range.replace(/\D/g, ''))
const end = Math.min(start + chunkSize, videoSize - 1)
const contentLength = end - start + 1
const headers = {
'Content-Range': `bytes ${start}-${end}/${videoSize}`,
'Accept-Ranges': 'bytes',
'Content-Length': contentLength,
'Content-Type': 'video/webm',
}
res.writeHead(206, headers)
const stream = fs.createReadStream(videoPath, { start, end })
stream.pipe(res)
}
// pages/index.js
<video autoPlay muted loop>
<source src='/api/video' type='video/webm' />
</video>
在本地,当我导航到 root localhost:3000/ 时,它按我的预期工作,
但是当我尝试以不同的方式打开该/api/video api 时,例如,当我导航到localhost:3000/api/video 或在邮递员中调用它时,出现Cannot read property 'replace' of undefined 的错误,我不明白req.headers.range 是undefined。同样在生产中,该 api 存在 500 错误,并且没有显示视频,如您从上面的站点链接中看到的那样。
我试过了:
if(!req.headers.range) // send the whole video at one
else ...
但在这种情况下,这不是我想要的流媒体,这也导致Exceeding Serverless Function Payload Size Limit
那么问题出在哪里,我该怎么办?提前谢谢!
【问题讨论】:
标签: node.js video next.js video-streaming