首页 > 其他分享 >django返回视频流

django返回视频流

时间:2023-09-19 16:45:07浏览次数:32  
标签:返回 resp 视频流 django length byte first type size

import re
import os
import mimetypes
from wsgiref.util import FileWrapper
from django.http import StreamingHttpResponse


def file_iterator(file_name, chunk_size=8192, offset=0, length=None):
    with open(file_name, "rb") as f:
        f.seek(offset, os.SEEK_SET)
        remaining = length
        while True:
            bytes_length = chunk_size if remaining is None else min(remaining, chunk_size)
            data = f.read(bytes_length)
            if not data:
                break
            if remaining:
                remaining -= len(data)
            yield data


def stream_video(request, path):
    """将视频文件以流媒体的方式响应"""
    range_header = request.META.get('HTTP_RANGE', '').strip()
    range_re = re.compile(r'bytes\s*=\s*(\d+)\s*-\s*(\d*)', re.I)
    range_match = range_re.match(range_header)
    size = os.path.getsize(path)
    content_type, encoding = mimetypes.guess_type(path)
    content_type = content_type or 'application/octet-stream'
    if range_match:
        first_byte, last_byte = range_match.groups()
        first_byte = int(first_byte) if first_byte else 0
        last_byte = first_byte + 1024 * 1024 * 8  # 8M 每片,响应体最大体积
        if last_byte >= size:
            last_byte = size - 1
        length = last_byte - first_byte + 1
        resp = StreamingHttpResponse(file_iterator(path, offset=first_byte, length=length), status=206, content_type=content_type)
        resp['Content-Length'] = str(length)
        resp['Content-Range'] = 'bytes %s-%s/%s' % (first_byte, last_byte, size)
    else:
        # 不是以视频流方式的获取时,以生成器方式返回整个文件,节省内存
        resp = StreamingHttpResponse(FileWrapper(open(path, 'rb')), content_type=content_type)
        resp['Content-Length'] = str(size)
    resp['Accept-Ranges'] = 'bytes'
    return resp

 

标签:返回,resp,视频流,django,length,byte,first,type,size
From: https://www.cnblogs.com/chen729765476/p/17715073.html

相关文章

  • .NET MVC返回图片并通知浏览器进行缓存
    publicActionResultImage(){stringfilePath="D:\\123.png";Response.Cache.SetExpires(DateTime.Now.AddDays(365));//缓存有效期为365天Response.Cache.SetCacheability(HttpCacheability.Public);//允许任何缓存服务器......
  • elementplus django drf 如何做到确认单据禁止删除
    elementplusdjangodrf如何做到确认单据禁止删除  要在Django和DjangoRestFramework(DRF)中实现禁止删除确认单据的功能,你可以通过以下步骤来完成:创建模型:首先,你需要在Django中创建一个模型来表示确认单据。这个模型应该包含与确认单据相关的所有信......
  • 子查询返回的值多于一个
    操作数据库编写了一个存储过程:大体如下:selectA,BfromTable1whereC=(selectXfromTable2whereT=XX)运行调用此存储过程时,报如下错误:子查询返回的值多于一个。当子查询跟随在=、!=、<、<=、>、>=之后,或子查询用作表达式时,这种情况是不允许......
  • Django如何http接收+返回docx文件,文件名中文
     fromdjango.utils.encodingimportescape_uri_pathfromdjango.httpimportHttpResponse view中函数:filepath="文件路径"withopen(filepath,'rb')asf:content=f.read()response=HttpResponse(conte......
  • 记录--JavaScript 令人惊讶的一点:对于空数组every()方法返回true
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助JavaScript语言的内核足够大,导致我们很容易误解它的某些部分是如何工作的。我最近重构了一些使用every()方法的代码,并且发现我并不真正理解every()的逻辑。在我看来,我认为回调函数必须被调用并返回true的时候ev......
  • Django框架高级之DRF部分源码分析
    【一】DRF之请求执行流程和APIView源码分析【二】DRF之Request源码分析【三】DRF之Response源码分析【四】DRF之登录认证源码分析......
  • Kingbase 函数查询返回结果集
    数据库使用过成中,时常会遇到需要返回一个结果集的情况,如何返回一个结果集,以及如何选择一个合适的方式返回结果集,是现场经常需要考虑的问题。下面介绍KingbaseES中各种返回结果集的方式。1.通过自定义类型方式,返回结果集--测试数据:创建自定义类型CREATETYPErctypeAS(idint......
  • Kingbase ES 函数返回-return语句
    文章概要:本文在https://www.cnblogs.com/kingbase/p/15703611.html一文的基础上总结了KingbaseES中函数能支持的return语句,整体上兼容oracle的基础上,也和PG语法一样。同时列举了sqlserevr表值函数和代码故障案例。一,关于return语句有5个return语句可以用来从KES函数中返回数......
  • EasyGBS视频流存储架构实现了什么功能多样性
    EasyGBS视频流存储架构基于GB28181接入设备,实现设备接入、存储、控制等功能。它支持视频汇聚、融合管理,能够兼容多类型设备和多协议接入。基于GB28181标准:EasyGBS使用GB28181标准,通过该标准接入设备,实现设备接入、存储、控制等功能。这使得EasyGBS能够兼容各种类型的设备和协议,实......
  • Django SimpleUI打造美丽后台
    DjangoSimpleUI打造美丽后台Django后台美化插件中,SimpleUI处于第一阵营,非常符合国人的审美观。本文将手把手教你如何配置使用SimpleUI,包括自定义菜单和控制面板等高级使用技巧. 安装 第一步pip安装并加入INSTALLED_APPSpipinstalldjango-simpleui ......