带 azure blob 存储的视频流 Node JS 控制器不工作

问题描述 投票:0回答:0

我编写了一个 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。

node.js stream video-streaming azure-blob-storage
© www.soinside.com 2019 - 2024. All rights reserved.