django实现视频播放和拖拽进度条

该文章介绍了如何在Django中使用StreamingHttpResponse处理MP4文件,实现视频的分段传输,从而支持前端的视频播放和进度条拖动功能。关键在于后端处理HTTP_RANGE头信息,根据范围请求返回相应的内容片段。
摘要由CSDN通过智能技术生成

django实现视频播放和拖拽进度条

django实现音乐或者视频播放可以使用http中的StreamingHttpResponse,MP4文件分段传送,同时是实现进度条拖动

前端代码:

<!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="example"  class="vjs-default-skin vjs-big-play-centered" controls autoplay>
    <source style=" background:#000;" src="/video/play/1" type="video/mp4">
    <p class="vjs-no-js"> To view this video please enable JavaScript, and consider upgrading to a web browser</p>
</video>
</body>
</html>

后端代码:记住status设置206否则进度条没有效果

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, id):
    """将视频文件以流媒体的方式响应"""
    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)
    if id:
        path = Video.objects.filter(id=id).first()
        path = path.file_address
    else:
        path = "mda-peg35p1w58n7hqzb.mp4"
    # 这里根据实际情况改变,我的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, last_byte = range_match.group('START'), range_match.group('END')
        if first_byte:
            first_byte = int(first_byte)
        else:
            first_byte = 0
        last_byte = first_byte + 1024 * 1024 * 8  # 8M per piece, the maximum volume of the response body
        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=206,
                                     content_type=content_type)
        resp['Content-Length'] = str(length)
        resp['Content-Range'] = 'bytes %s-%s/%s' % (first_byte, last_byte, size)
    else:
        # When the video stream is not obtained, the entire file is returned in the generator mode to save memory.
        resp = StreamingHttpResponse(FileWrapper(open(file_path, 'rb')), content_type=content_type)
        resp['Content-Length'] = str(size)
    resp['Accept-Ranges'] = 'bytes'
    return resp
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
首先,我们需要安装Djangodjango-widget-tweaks: ``` pip install django pip install django-widget-tweaks ``` 接下来,创建Django项目和应用程序: ``` django-admin startproject progress_bar_project cd progress_bar_project python manage.py startapp progress_bar ``` 在`progress_bar`应用程序中创建一个模型: ```python from django.db import models class Task(models.Model): name = models.CharField(max_length=100) progress = models.IntegerField(default=0) ``` 然后,我们需要创建一个视图函数来处理进度条的更新。在`progress_bar/views.py`中添加以下代码: ```python from django.shortcuts import render from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from .models import Task @csrf_exempt def update_progress(request): if request.method == 'POST': task_id = request.POST.get('task_id') progress = request.POST.get('progress') task = Task.objects.get(id=task_id) task.progress = progress task.save() return JsonResponse({'success': True}) ``` 在这个视图函数中,我们使用`JsonResponse`来返回一个JSON格式的响应,通知前端进度条已经更新成功。 接下来,我们需要创建一个模板来渲染进度条。在`progress_bar/templates`目录下创建一个名为`progress_bar.html`的文件,并添加以下代码: ```html {% load widget_tweaks %} {% block content %} <h1>Progress Bar</h1> <form method="POST" id="progress-form"> {% csrf_token %} <input type="hidden" name="task_id" value="{{ task.id }}"> <div class="progress"> <div class="progress-bar" role="progressbar" aria-valuenow="{{ task.progress }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ task.progress }}%;"> {{ task.progress }}% </div> </div> <br> <div class="form-group"> {% render_field progress|add_class:"form-control-range" %} </div> <button type="submit" class="btn btn-primary">Update Progress</button> </form> <script> $(function() { $('#progress-form').submit(function(event) { event.preventDefault(); $.ajax({ type: 'POST', url: '{% url "update_progress" %}', data: $(this).serialize(), success: function(response) { if (response.success) { alert('Progress updated successfully!'); } } }); }); }); </script> {% endblock %} ``` 在这个模板中,我们使用Django Widget Tweaks来渲染进度条的表单元素。我们还使用jQuery和Ajax来处理进度条的更新。当用户提交表单时,我们将进度值发送到服务器上的`update_progress`视图函数进行处理。 最后,我们需要创建一个URL路由来将请求发送到`update_progress`视图函数。在`progress_bar/urls.py`中添加以下代码: ```python from django.urls import path from . import views urlpatterns = [ path('update_progress/', views.update_progress, name='update_progress'), ] ``` 现在我们已经完成了进度条的管理功能,可以生成代码并运行Django应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小福不认命

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值