sunobject 2022-08-05 13:48 采纳率: 100%
浏览 64
已结题

Django+video.js + streamingHttpResponse

问题遇到的现象和发生背景

我用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分段的方式

  • 写回答

3条回答 默认 最新

  • 这次真没糖 2022-08-05 14:17
    关注

    iOS和安卓要分开写
    参考:ios浏览器无法播放视频-node.js文件传输问题:https://blog.csdn.net/qq_38918754/article/details/117750375

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月13日
  • 已采纳回答 8月5日
  • 创建了问题 8月5日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么