我编写了一个 Node JS 控制器,它从 azure blob 存储中为视频文件创建可读流,然后将其通过管道传输到响应对象以将视频流式传输到客户端。但是视频需要很长时间才能播放。我猜浏览器没有发送范围标头。当我对范围标头进行硬编码时,视频无法播放并且浏览器显示响应被截断并且无法播放视频。
这是我的代码
import { BlobServiceClient } from '@azure/storage-blob';
import Video from '../models/video.js';
import dotenv from 'dotenv'
import Account from '../models/apiKey.js';
import path from 'path'
import mime from 'mime';
import { config } from '../config/config.js';
dotenv.config()
const {AZURE_CONNECTION_STRING}=config
const blobServiceClient = BlobServiceClient.fromConnectionString(AZURE_CONNECTION_STRING);
export const getVideo = async (req, res) => {
try {
const {container}= await Account.findOne({apikey:req.headers.apikey})
console.log(container)//successs
const containerClient = blobServiceClient.getContainerClient(container);
const { url } = await Video.findOne({ _id: req.params.id });
const blobName = path.basename(url)//
console.log(blobName+"this is the blob name")
const contentType = mime.getType(blobName);
console.log(url)
const blobClient = containerClient.getBlobClient(blobName);
const downloadResponse = await blobClient.download();
res.setHeader('Content-Type', contentType);
res.setHeader('Content-Length', downloadResponse.contentLength);
const range = req.headers.range;
if (!range) {
console.log('no range');
res.status(416);
res.end();
return;
} else {
console.log(range);
const positions = range.replace(/bytes=/, '').split('-');
const start = parseInt(positions[0], 10);
const end = positions[1] ? parseInt(positions[1], 10) : downloadResponse.contentLength - 1;
const chunksize = (end - start) + 1;
res.writeHead(206, {
'Content-Range': `bytes ${start}-${end}/${downloadResponse.contentLength}`,
'Accept-Ranges': 'bytes',
'Content-Length': chunksize,
'Content-Type': 'video/mp4',
});
downloadResponse.readableStreamBody.pipe(res, { end: true, start, end });
}
} catch (e) {
console.log(`an error occured`);
res.status(500).send(e.message);
}
};
这是我的代码,我修改它以在未提供范围但仍然无法正常工作时发送状态 416。