Django使用流响应streamingHttpResponse处理视频

前端

首先前端标签采用的是videojs,需先挂载videojs,此处就不做详细说明

<video id="example_video" width="100%" height="50%" class="video-js vjs-default-skin " controls poster="" style="display: inline-block;">
	<source src="/stream_video/?path={
     
     {path}}" type="video/mp4">
</video>

很明显src指向的/stream_video/?path={ {path}}是关键,这个path是播放视频的这个模板接收从视图传过来的视频文件名称,由此可以实现播放不同视频,详细自己研究研究,咱们这篇文章重点是使用streamingHttpResponse处理视频。

urls.py文件

用过Django的小白应该都清楚前端访问一个链接或者路径都是通过urls.py文件中对应的url或path实现传递,现在我们看看urls文件中的设置

url('stream_video/', views.stream_video),

views.py文件

看过urls文件,知道要进入视图文件了,视图文件内就是逻辑和数据处理了,我们现在进入stream_video()函数

def stream_video(request):
    """将视频文件以流媒体的方式响应"""
    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)
    path = request.GET.get('path')#path就是template?后面的参数的值
    folder_path = os.getcwd().replace('\\', '/')
    """
    下面的os.path.join根据实际情况改变,我的是在settings里做了一个FILES_DIR,
    把路径指向了项目外别的文件夹中去找视频文件
	如果不需要指向项目外其他文件夹,直接指到static内你放视频的文件夹就行
	"""
    path = os.path.join(settings.FILES_DIR, path)
    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 * 10
        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

使用流响应时记得import streamingHttpResponse

from django.http import StreamingHttpResponse

小结

身为小白的我,当初做项目时,网上找的流响应处理视频的教程,全部是光讲了视图函数内的写法,跟模板联动起来时踩了无数的坑,现在把整个数据传输的地方都捋清楚了,希望可以帮助到刚入坑的小白

猜你喜欢

转载自blog.csdn.net/Micrasoft007/article/details/109056952