赞
踩
首先前端标签采用的是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处理视频。
用过Django的小白应该都清楚前端访问一个链接或者路径都是通过urls.py文件中对应的url或path实现传递,现在我们看看urls文件中的设置
url('stream_video/', views.stream_video),
看过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
身为小白的我,当初做项目时,网上找的流响应处理视频的教程,全部是光讲了视图函数内的写法,跟模板联动起来时踩了无数的坑,现在把整个数据传输的地方都捋清楚了,希望可以帮助到刚入坑的小白
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。