基于Werkzeug实现Django分片音视频流,求优化建议
Django中基于Werkzeug的分片视频流实现优化建议求助
一直以来,我使用RangedFileResponse在Django中实现分片流传输(主要适配Safari浏览器),所用版本是经过深度定制的django-ranged-fileresponse分支版本。
近期在全面使用django-extensions配置开发环境SSL的过程中接触到Werkzeug,发现它可以用来实现分片文件响应。于是我编写了如下代码,测试后发现其速度明显优于原方案,部分场景下提升显著,已确认可作为替代方案:
from werkzeug.http import parse_range_header from django.http import FileResponse, HttpResponseNotAllowed, HttpResponseBadRequest import os def stream_video(request, fqpn, content_type="video/mp4"): file_size = os.path.getsize(fqpn) if request.method != 'GET': return HttpResponseNotAllowed(['GET']) if request.is_secure(): range_header = request.META.get('HTTPS_RANGE') else: range_header = request.META.get('HTTP_RANGE') ranges = parse_range_header(range_header) if not ranges: return FileResponse(open(fqpn, 'rb')) # For simplicity, handle only single range requests start, end = ranges[0] with open(fqpn, 'rb') as file_to_send: file_to_send.seek(start) data = file_to_send.read(end - start + 1) response = FileResponse(data, content_type='application/octet-stream') response['Content-Length'] = len(data) response['Content-Range'] = f'bytes {start}-{end}/{file_size}' response['Accept-Ranges'] = 'bytes' response.status_code = 206 # Partial Content return response
补充说明
- 生产环境使用GUnicorn或Hypercorn,开发环境通常使用Django自带服务器或django-extensions的RunServerPlus,两种环境下代码均运行正常。
- 发现当视频播放器未暂停就关闭时,会触发OSError,需要捕获该异常。
现请教各位,有没有优化这段代码的建议?
内容的提问来源于stack exchange,提问作者Benjamin Schollnick
相关产品推荐
相关产品推荐

