You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何监听Flask视频流加载事件以显示加载动画?

解决视频流img标签加载前显示加载GIF的问题

核心思路:监听img元素的加载/渲染状态

你用$(window).ready()没用是因为这个事件只关心DOM结构加载完毕,和img标签里的视频流资源加载进度完全无关。正确的做法是监听img元素的加载完成事件,或者通过轮询检测img是否开始渲染内容,来切换加载状态。

方法一:使用img的onload事件

先在页面上放好加载GIF和隐藏的视频流img,等img加载完成(开始显示视频流)后,再隐藏加载图、显示视频img。

<!-- HTML结构 -->
<div id="video-container">
  <img src="/loading.gif" id="loading-indicator" alt="加载中..." />
  <img src="" id="video-feed" style="display: none;" alt="视频流" />
</div>

<script>
// 获取元素
const loadingImg = document.getElementById('loading-indicator');
const videoImg = document.getElementById('video-feed');

// 动态设置视频流地址,触发加载
videoImg.src = '/video_feed';

// 监听视频img加载完成事件
videoImg.onload = function() {
  // 隐藏加载图,显示视频流
  loadingImg.style.display = 'none';
  videoImg.style.display = 'block';
};
</script>

方法二:轮询检测img渲染状态(应对onload不触发的情况)

有些持续推流的视频流可能不会触发img的onload事件,这时候可以用定时器轮询检查img的尺寸,当它的宽高大于0时,说明已经开始渲染内容了:

<div id="video-container">
  <img src="/loading.gif" id="loading-indicator" alt="加载中..." />
  <img src="/video_feed" id="video-feed" style="display: none;" alt="视频流" />
</div>

<script>
const loadingImg = document.getElementById('loading-indicator');
const videoImg = document.getElementById('video-feed');

// 轮询检查
const checkInterval = setInterval(() => {
  // 检查img是否有实际渲染尺寸
  if (videoImg.width > 0 || videoImg.height > 0) {
    loadingImg.style.display = 'none';
    videoImg.style.display = 'block';
    clearInterval(checkInterval); // 停止轮询
  }
}, 500); // 每500毫秒检查一次
</script>

关于Ajax方案的说明

其实没必要用Ajax请求后修改div内容,因为img标签设置src本身就是发起HTTP请求获取资源,直接动态设置src并监听状态更简单,没必要多一层Ajax请求。

另外你提到video标签无法正常工作,上面的img方案完全可以替代,只要你的视频流格式(比如MJPEG)支持通过img标签渲染就行。

内容的提问来源于stack exchange,提问作者djb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:29:09