Django实现视频播放的具体示例
作者:Candyeel 发布时间:2022-11-04 22:26:35
标签:Django,视频播放
view视图
import re
import os
import mimetypes
from wsgiref.util import FileWrapper
from django.http import StreamingHttpResponse
from django.shortcuts import render
from django.conf import settings
def file_iterator(file_name, chunk_size=8192, offset=0, length=None):
# 每次最多读取8Kb
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):
"""将视频文件以流媒体的方式响应"""
range_header = request.META.get('HTTP_RANGE', '').strip()
range_re = re.compile(r'bytes\s*=\s*(?P<START>\d+)\s*-\s*(?P<END>\d*)', re.I)
range_match = range_re.match(range_header)
path = request.GET.get('path')
#这里根据实际情况改变,我的views.py在core文件夹下但是folder_path却只到core的上一层,media也在core文件夹下
video_path = os.path.join(settings.BASE_DIR, 'static', 'video') # 视频放在目录的static下的video文件夹中
file_path = os.path.join(video_path, path) #path就是template ?path=后面的参数的值
size = os.path.getsize(file_path) # 文件总大小
content_type, encoding = mimetypes.guess_type(file_path)
content_type = content_type or 'application/octet-stream'
if range_match:
# first_byte播放到的位置
# 下次播放的位置
first_byte, last_byte = range_match.group('START'), range_match.group('END')
first_byte = int(first_byte) if first_byte else 0
# 从播放的位置往后读取10M的数据
last_byte = first_byte + 1024 * 1024 * 10
if last_byte >= size: # 如果想读取的位置大于文件大小
last_byte = size - 1 # 最后将图片全部读完
length = last_byte - first_byte + 1 # 此次读取的长度(字节)
resp = StreamingHttpResponse(file_iterator(file_path, offset=first_byte, length=length), status=200, 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(file_path, 'rb')), content_type=content_type)
resp['Content-Length'] = str(size)
resp['Accept-Ranges'] = 'bytes'
return resp
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
</head>
<body>
<video id="media" src="" width="720" height="480" controls autoplay>浏览器不支持video标签 </video>
</video>
</body>
<script>
$(function () {
$("#media").attr('src', '/test_resp/?path=/media/video.mp4');
})
</script>
</html>
来源:https://blog.csdn.net/weixin_45111060/article/details/123447975
0
投稿
猜你喜欢
- 本文介绍了asp中 adpbe.stream 的语法,各种参数使用说明,方便大家查阅。更多请看:VBScript 速查手册(语言参考) ch
- 如下所示:import matplotlib.pyplot as plt import tkinter import numpy as np
- 前言在python基础知识中有说过,字典是可变的数据类型,其参数又是键对值。setdefault()方法和字典的get()方法在一些地方比较
- 一、临时表空间概念临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当
- 登录百度,首先当然是先抓百度的登录包 ,由于是网页登录,最方便的自然是httpwatch了,我使用的测试账号是itiandatest1,密码
- pandas基于numpy,所以其中的空值nan和numpy.nan是等价的。numpy中的nan并不是空对象,其实际上是numpy.flo
- 在ASP.net页面中,我们编写JavaScript脚本附加有注释时,这些注释也往往会随JavaScript脚本一起送到客户端。
- 前言:我们先定义一个test01.py的文件。test01.py中代码如下所示:def step():print(__name__) &nb
- 就是一个简单的python查询百度关键词排名的函数,以下是一些简介:1、UA随机2、操作简单方便,直接getRank(关键词,域名)就可以了
- 我就废话不多说,直接上代码吧:# -*- coding: utf-8 -*-import osout=os.system('nets
- 项目结构:源代码:# -*- coding: utf-8 -*-"""@date: 2022/01
- Python中有很多运算符,今天我们就来讲讲is和==两种运算符在应用上的本质区别是什么。在讲is和==这两种运算符区别之前,首先要知道Py
- 1. 首先到 nodejs.org 下载 Node.js 安装包并安装。2. 打开 Sublime Text 2 编辑器。选择菜单 Tool
- 使用ajax获取服务器数据返回给客户端,出现中文乱码。在之前的一个ajax应用中指定codepage=936,将所有页面编码都指定为GB23
- 如何检测某个对象是否有某个属性?第一想到的——没错,in:"prop" in obj这很完美,不过,还有不少人热衷下面的
- wheel文件Wheel和Egg都是python的打包格式,目的是支持不需要编译或制作的安装过程,实际上也是一种压缩文件,将.whl的后缀改
- ajax的优缺点AJAX使用Javascript技术向服务器发送异步请求AJAX无须刷新整个页面因为服务器响应内容不再是整个页面,而是页面中
- GitHub : https://github.com/jayknoxqu/id-number-util身份组成方式中华人民共和国国家标准G
- 问题:因为有的友情连接的网站关闭或者网络连接较慢导致连接的LOGO图片显示不出来或者显示很慢.在IE下面老是提示剩下几项没打开,看起来很不舒
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 2 - Selectors如果你还没有准备好,请先