小元
博客
详情文字在这里缓缓展开
静候你翻开这一页

应该如何正确播放“MJPEG”呢?

在网页中播放MJPEG视频流时,会出现闪屏,白屏等画面,到底应该如何播放呢?

MJPEG


   问题描述:

       某项目要求在本地运行,不能安装第三方软件或一些依赖等,也无法链接外网,有播放某监控画面的功能,而该监控推的视频流为“mjpeg”,该视频流在img标签内能直接播放,但在播放约2分钟左右后就会出现白屏,且在播放途中会出现闪屏画面。


   MJPEG简介:

       MJPEG全名为 "Motion Joint Photographic Experts Group",是一种视频编码格式,中文名称翻译为“技术即运动静止图像(或逐帧)压缩技术”,其中每个帧都是独立的JPEG图片。


   问题排查:

       由于MJPEG是将每帧都转化为独立的图片,在调试工具中可看到该图片一直在不断的请求,频率极快,这就导致了页面也在以极快的频率进行刷新,一方面会造成性能瓶颈,另一方面大量的图片也可能会被游览器缓存,各种因素的叠加就造就了白屏等事故的出现,以上这只是我的猜测和推断。

1730946121837.gif


   解决办法:

       以下方法不太靠谱,请参考另一篇文章:MJPEG

       这是一个不是解决办法的办法,设置一个setTimeout的定时器,每隔一秒就主动修改一下图片的src地址,同时在请求参数中加上当前的时间戳防止游览器缓存,这会导致频繁请求,但不会出现白屏和闪屏。

<template>
  <div class="box">
    <img ref="imgRef" width="100%" height="550px"/>

  </div>
</template>

<script setup lang="ts">
import {onBeforeUnmount, onMounted, ref} from "vue";

const imgRef = ref<HTMLImageElement | null>(null);

let timer = 0;
function updateImage() {
  if (!imgRef.value) return;
  imgRef.value.src = `请求地址?time=${new Date().getTime()}`;

  timer && clearTimeout(timer);
  timer = setTimeout(() => {
    updateImage();
  }, 1000);
}


onMounted(() => {
  updateImage();
});

onBeforeUnmount(() => {
  timer && clearTimeout(timer);
});
</script>

   正如上文说所这是一个不是解决办法的办法,目前没有找到什么特别好的解决方法,如果各位大神还有什么别的方法,欢迎在下发留言讨论。


   

渝ICP备2024031078号-1
本网站一切内容不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
如无意中侵犯了企业或个人的知识产权等,请及时通过电子邮件(1102905617@qq.com)告知我,本网站将会给予删除。
最新公告
😊访客你好,很高兴你的到来,本博客仍在建设中,还有些许功能尚在开发中,最后祝你在此能有所收获。
💥小元博客第三代自2025年9月上线以来,2026/08/09日迎来了它的第三次更新本次更新内容如下:
1. 文章详情页样式变更,由原来的弹窗改为单独的页面。
2. 使用Nuxt对项目进行了SEO优化,优化了搜索引擎的抓取和索引。
3. 对验签进行了优化,降低了请求被误触发拦截的概率。
4. 移动端也正在稳步推进中,在不久的将来会与大家见面。
5. 修复了首页黄历节日不显示的问题,以及其它bug的修复。