问题遇到的现象和发生背景
我用Django在做一个在线课程网站,视频播放采用 video.js + streamingHttpResponse,在Windows和安卓上使用Google Chrome,均能正常播放视频,但是安卓+360浏览器就不能播放,iOS也不能播放,如果不用 streamingHttpResponse分段传送, <source type="video/mp4" src="%7b%7b%20MEDIA_URL%20%7d%7d%7b%7b%20course.video_url%20%7d%7d" />所有平台都可以访问
问题相关代码,请勿粘贴截图
html:前台使用Django模板
<video id="couse_video_1" class="video-js vjs-big-play-centered vjs-16-9 vjs-fluid"
controls controlslist="nodownload noremoteplayback" oncontextmenu = "return false" preload="auto"
poster="{{ MEDIA_URL }}{{ course.image }}"
data-setup="" >
<source src="/course/stream_video/?path={{ MEDIA_URL }}{{ course.video_url }}" type="video/mp4">
<p>你的浏览器不支持 HTML5 Video。</p>
</video>
views:
@login_required
def stream_video(request):
#print("将视频文件以流媒体的方式响应")
"""将视频文件以流媒体的方式响应"""
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')#path就是template?后面的参数的值
folder_path = os.getcwd().replace('\\', '/')
path = folder_path+ path
#print('path2 =',file_path,'path=',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.group('START'), range_match.group('END')#range_match.groups()
first_byte = int(first_byte) if first_byte else 0
last_byte = first_byte + 1024 * 1024 * 8
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-Type'] = 'video/mp4'
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-Type'] = 'video/mp4'
resp['Content-Length'] = str(size)
resp['Accept-Ranges'] = 'bytes'
return resp
def file_iterator(file_name, chunk_size=8192, offset=0, length=None):
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
运行结果及报错内容
django:
[05/Aug/2022 13:34:53,944] - Broken pipe from ('192.168.1.8', 61632)
前台:
The media could not be loaded,either because the server or network failed or because the format is not supported
我的解答思路和尝试过的方法
我尝试baidu,修改video.js配置,修改stream_video都无果
我想要达到的结果
我希望达到,网站可以PC或移动设备均能正常播放视频,当然是使用 streamingHttpResponse分段的方式