海康威视有插件、无插件播放;webrtc直播;西瓜视频播放器;mpegts.js直播;flvjs直播

news2024/9/25 13:13:59

Notes 视频播放的几种方式

一、Video

  1. mp4链接直接播放

二、海康威视3.3插件版直播、云台控制,资源下载地址

  1. index.html引入hk文件中的js文件
  2. 双击HCWebSDKPlugin.exe安装插件
  3. 前端参照文件夹hkCamera中的示例代码
    在这里插入图片描述

三、海康威视3.2无插件版直播,资源下载地址

  1. 打开WEB无插件开发包_v3.2文件
  2. 进入目录\WEB无插件开发包_v3.2\nginx-1.10.2\conf
  3. 打开 nginx.conf
  4. 可配服务IP及端口
         listen  9000;
         server_name  127.0.0.1;
    
  5. 进入目录\WEB无插件开发包_v3.2\nginx-1.10.2,双击start.bat可开启nginx服务
  6. 浏览访问 http://127.0.0.1:9000/cn/demo.html#/
  7. demo.html 页面已根据实际情况做了修改,可嵌入iframe使用
  8. 配合前端使用
     <iframe ref="iframe"
                 class="iframe"
                 src="http://127.0.0.1:9000/cn/demo.html#/"></iframe>
    
     const iframe = ref();
     function openVideoModal() {
         <!-- 与iframe通信,可做一定的延迟,因为要页面已加载,iframe页面才能监听到通信 -->
         if (iframe.value)
            iframe.value.contentWindow.postMessage({ type: 'play', cameraIp: '摄像机或录像机IP,可看demo.js中的配置', }, '*');
     }
     function closeVideoModal() {
         if (iframe.value)
             iframe.value.contentWindow.postMessage({ type: 'stop', }, '*');
     }
    

四、webrtc,资源下载地址

  1. index.html引入,webrtc中的两个js文件
  2. 前端
    1. 页面
         <template>
             <div :class="{ webrtcVideo: true, videoLoad: !videoLoadSuccess }">
                 <video class="webrtcVideo"
                     :id="'video_' + videoUrl"
                     ref="videoRef"
                     autoplay
                     loop
                     muted
                     :controls="controls"></video>
             </div>
         </template>
    
         <script setup>
         import { onBeforeUnmount, onMounted, ref } from 'vue';
         import { Webrtc } from "./webrtc.js";
         defineExpose({ replay });
         const props = defineProps({
             <!-- rtsp://admin:wts12345@172.16.100.165:554/Streaming/Channels/101 -->
             videoUrl: {
                 type: String,
                 default: '',
                 required: true,
             },
             controls: {
                 type: Boolean,
                 default: true,
                 required: true,
             },
         });
         const videoRef = ref();
         const videoLoadSuccess = ref(false);
    
         function replay() {
             videoRef.value.load();
         }
    
         onMounted(() => {
             Webrtc.getInstance().connect(props.videoUrl);
    
             videoRef.value.addEventListener('loadedmetadata', function () {
                 console.log('props.videoUrl----', "视频元数据加载完毕", props.videoUrl);
                 videoLoadSuccess.value = true;
             }, true);
    
         });
         onBeforeUnmount(() => {
             Webrtc.getInstance().disconnect(props.videoUrl);
         });
         </script>
    
         <style lang='less' scoped>
         .webrtcVideo {
             width: 100%;
             height: 100%;
             object-fit: fill;
             position: relative;
             // background-color: red;
         }
    
         .videoLoad:before {
             content: '视频加载中...';
             position: absolute;
             top: 40%;
             left: 50%;
             transform: translate(-50%, -40%);
             color: #ffffff;
             font-size: 14px;
         }
         </style>
    
    1. 连接 webrtc.js
     export class Webrtc {
         constructor() {
             this.urlMap = new Map();
         }
         static instance;
         static getInstance() {
             if (!this.instance) {
             this.instance = new Webrtc();
             }
             return this.instance;
         }
    
         connect(rtspUrl, key) {
             let id = "video_" + rtspUrl; //对应元素id
    
             if (!rtspUrl) return;
    
             let webRtcServer = new WebRtcStreamer(id,`http://127.0.0.1:28000`);//对应推流服务运行命令中的ip:port
             console.log("webrtc  rtsp地址:" + rtspUrl);
             webRtcServer.connect(rtspUrl,null,"rtptransport=tcp",null);
             this.urlMap.set(id, webRtcServer);
         }
    
         disconnect(url) {
             let id = "video_" + url; //对应元素id
             let webrtc = this.urlMap.get(id);
             if (webrtc) webrtc.disconnect();
             this.urlMap.delete(id);
         }
     }
    
    
  3. 推流服务
    1. 文档https://github.com/mpromonet/webrtc-streamer
    2. 打开webrtc-streamer文件夹
    3. 复制运行命令.txt中的命令,IP和端口可根据实际情况修改
    4. 在webrtc-streamer-v0.8.4-dirty-Windows-AMD64-Release 文件目录下,运行上述命令

五、西瓜视频播放器 xgplayer v3.X

  1. 文档 https://h5player.bytedance.com/plugins/extension/xgplayer-flv.html#%E5%AE%89%E8%A3%85
  2. CDN安装(也可npm安装),index.html引入
     <script src="https://unpkg.byted-static.com/xgplayer/3.0.10/dist/index.min.js" charset="utf-8"></script>
     <script src="https://unpkg.byted-static.com/xgplayer-flv/3.0.10/dist/index.min.js" charset="utf-8"></script>
    
  3. 实现
       <!-- 播放容器 -->
       <div id="player1"></div>
       
       <!-- 播放 -->
       let player = ref();
       function play(){
         player.value = new window.Player({
                 id: 'player1',
                 isLive: true,
                 playsinline: true,
                 url: "https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv",
                 autoplay: true,
                 fluid: true,//流式布局,可使播放器宽度跟随父元素的宽度大小变化
                 plugins: [window.FlvPlayer],
             });
       }
       <!-- 销毁 -->
       function destroy(){
         player.value.destroy()
         player.value = null
       }
    
    

六、mpegts.js

  1. 文档 https://github.com/xqq/mpegts.js/blob/master/README_zh.md
  2. 安装 npm install --save mpegts.js
  3. 实现
       <!-- 播放容器 -->
       <div id="player1"></div>
       
       <!-- 播放 -->
       import mpegts from 'mpegts.js';
       let player = ref();
       function play(){
       if (mpegts.isSupported()) {
             let videoElement = document.getElementById('player1');
             player.value = mpegts.createPlayer({
                 type: 'flv',
                 isLive: true,
                 url: "https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv"
             }, {
                 liveBufferLatencyChasing: true,//开启追帧
                 liveBufferLatencyMaxLatency: 0.9,//最大缓存时间
                 liveBufferLatencyMinRemain: 0.2,//最小缓存时间
             });
             player.value.attachMediaElement(videoElement);
             player.value.load();
    
             // ------------------播放器的一些异常监听
             player.value.on(mpegts.Events.ERROR, (e) => {
                 console.log('mpegts.Events.ERROR----发生异常', e);
             });
             player.value.on(mpegts.Events.LOADING_COMPLETE, (e) => {
                 console.log('mpegts.Events.LOADING_COMPLETE----直播结束', e);
             });
             player.value.on(mpegts.Events.STATISTICS_INFO, (e) => {
                 console.log('mpegts.Events.STATISTICS_INFO----解码帧', e.decodedFrames);
             });
         }
       }
       <!-- 销毁 -->
       function destroy(){
         player.value.destroy()
         player.value = null
       }
    
    

七、flv.js

  1. 文档 https://github.com/bilibili/flv.js
  2. 安装 npm install --save flv.js
  3. 实现
       <!-- 播放容器 -->
       <div id="player1"></div>
       
       <!-- 播放 -->
       import flvjs from 'flvjs.js';
       let player = ref();
       function play(){
       if (flvjs.isSupported()) {
             let videoElement = document.getElementById('player1');
             player.value = flvjs.createPlayer({
                 type: 'flv',
                 url: "https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv"
             });
             player.value.attachMediaElement(videoElement);
             player.value.load();
             player.value.play();
         }
       }
       <!-- 销毁 -->
       function destroy(){
         player.value.destroy()
         player.value = null
       }
    
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1430070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读-在分布式数据库环境中对哈希算法进行负载均衡基准测试

论文名称&#xff1a;Benchmarking Hashing Algorithms for Load Balancing in a Distributed Database Environment 摘要 现代高负载应用使用多个数据库实例存储数据。这样的架构需要数据一致性&#xff0c;并且确保数据在节点之间均匀分布很重要。负载均衡被用来实现这些目…

【Vue3】源码探索之旅:compiler-core之parseChildren函数(二)

简言 parseChildren函数是在baseParse函数中作为createRoot函数的子节点参数传入的&#xff0c;今天来探索下parseChildren函数。 parseChildren在 compiler-core/src/parse.ts文件内。 parseChildren 这个函数就是用来解析模板字符串内容的 &#xff0c;里面有个while循环…

Jmeter学习系列之四:测试计划元素介绍

测试计划元素 JMeter包含各种相互关联但为不同目的而设计的元素。在开始使用JMeter之前&#xff0c;最好先了解一下JMeter的一些主要元素。 注意:测试计划包含至少一个线程组。 以下是JMeter的一些主要组件: 测试计划&#xff08;Plan&#xff09;线程组(Thread Group)控制器…

调试以及发布npm组件

开发原因&#xff1a; 由于公司自己的封装到npm的组件有点问题&#xff0c;负责人由在忙其他&#xff0c;就由我去负责改改&#xff0c;中途出了不少问题&#xff0c;记录一下。 一、下载源码 第一步肯定是去git上把组件的源码下载下来&#xff0c;这一步没什么好说&#xf…

19.HarmonyOS App(JAVA)依赖布局DependentLayout使用方法

layout/ability_main.xml 显示位置不对&#xff1a;检查布局文件ohos:lef_of "id:tuzi",比如显示在兔子的左侧&#xff0c;这里就会显示不对。 需要id前没有$符号。改为&#xff1a; ohos:lef_of "$id:tuzi" <?xml version"1.0" encodi…

方法引用练习:

技巧&#xff1a; 1.现在有没有一个方法符合我当前的需求 2.如果有这样的方法&#xff0c;这个方法是否满足引用的规则 练习一&#xff1a; 思路&#xff1a;//集合中的数据还是String类型&#xff0c;要放入Student类型数组中还需要先转型成Student类型 public class MyTest…

每日一题Leetcode 1686石子游戏Ⅵ

1686. 石子游戏 VI 题目描述&#xff1a; Alice 和 Bob 轮流玩一个游戏&#xff0c;Alice 先手。 一堆石子里总共有 n 个石子&#xff0c;轮到某个玩家时&#xff0c;他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道…

linux安装二进制openjdk1.8版本【配置永久加载环境变量】

二进制jdk下载地址&#xff1a;https://www.openlogic.com/openjdk-downloads 选择64位 jdk的 java8下载,然后解压 $ cd /home/ec2-user/config/ $ tar xf openlogic-openjdk-8u382-b05-linux-x64.tar.gz $ mv openlogic-openjdk-8u382-b05-linux-x64 openjdk-8编辑环境变…

机器学习 | 如何利用集成学习提高机器学习的性能?

目录 初识集成学习 Bagging与随机森林 Otto Group Product(实操) Boosting集成原理 初识集成学习 集成学习&#xff08;Ensemble Learning&#xff09;是一种通过组合多个基本模型来提高预测准确性和泛化能力的机器学习方法。它通过将多个模型的预测结果进行整合或投票来做…

vue3-逻辑复用

什么是组合式函数 _无状态逻辑的函数_&#xff1a;它在接收一些输入后立刻返回所期望的输出。 比如 时间格式化的函数。 有状态逻辑的函数: 有状态逻辑负责管理会随时间而变化的状态。 比如 跟踪当前鼠标在页面中的位置。 在 Vue 应用的概念中&#xff0c;“组合式函数”(…

智能汽车竞赛摄像头处理(3)——动态阈值二值化(大津法)

前言 &#xff08;1&#xff09;在上一节中&#xff0c;我们学习了对图像的固定二值化处理&#xff0c;可以将原始图像处理成二值化的黑白图像&#xff0c;这里面的本质就是将原来的二维数组进行了处理&#xff0c;处理后的二维数组里的元素都是0和255两个值。 &#xff08;2…

LeetCode 热题 100 | 链表(中上)

目录 1 141. 环形链表 1.1 哈希表 1.2 快慢指针 2 142. 环形链表 II 2.1 哈希表 2.2 快慢指针 3 21. 合并两个有序链表 4 2. 两数相加 菜鸟做题第三周&#xff0c;语言是 C 1 141. 环形链表 1.1 哈希表 解题思路&#xff1a;遍历链表&#xff0c;在哈希表中…

ROS方向第二次汇报(5)

文章目录 1.本方向内学习内容&#xff1a;1.1.自定义msg&#xff1a;1.1.1.定义msg文件&#xff1a;1.1.2.编辑配置文件&#xff1a; 1.2.自定义srv&#xff1a;1.2.1.定义srv文件&#xff1a;1.2.2.编辑配置文件&#xff1a; 1.3.服务通信案例实现&#xff1a;1.3.1.服务端实现…

HTML+CSS:导航栏组件

效果演示 实现了一个导航栏的动画效果&#xff0c;当用户点击导航栏中的某个选项时&#xff0c;对应的选项卡会向左平移&#xff0c;同时一个小圆圈会出现在选项卡的中心&#xff0c;表示当前选项卡的位置。这个效果可以让用户更加清晰地了解当前页面的位置和内容。 Code <…

正点原子--STM32定时器学习笔记(2)

书接上文&#xff0c;本篇是对基本定时器实验部分进行的总结~ 实验目标&#xff1a;通过TIM6基本定时器定时500ms&#xff0c;让LED0每隔500ms闪烁。 解决思路&#xff1a;使用定时器6&#xff0c;实现500ms产生一次定时器更新中断&#xff0c;在中断里执行“翻转LED0”。 定时…

【leetcode题解C++】98.验证二叉搜索树 and 701.二叉搜索树中的插入操作

98. 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例…

kubernetes基本概念和操作

基本概念和操作 1.Namespace1.1概述1.2应用示例 2.Pod2.1概述2.2语法及应用示例 3.Label3.1概述3.2语法及应用示例 4.Deployment4.1概述4.2语法及应用示例 5.Service5.1概述5.2语法及应用示例5.2.1创建集群内部可访问的Service5.2.2创建集群外部可访问的Service5.2.3删除服务5.…

Zoho Mail企业邮箱商业扩展系列第1部分:入门指南与基础设置

今天让我们来认识一下王雪琳&#xff0c;她是一位独立经营的营销咨询机构的个体企业家。在开始自己的事业之前&#xff0c;她进行了广泛的市场调研&#xff0c;明确了自己的业务定位&#xff0c;并全力以赴地投入到了自己的企业中。 一、创业背景 王雪琳的营销业务主要集中在…

日志报错 git -c dif.mnemonicprefix=false -c core.guotepath=false 解决方法

前言: 在进行下面操作前,必须确保,你是否安装了Git。 查看Git 在命令行窗口中输入`git --version`: 如果这个命令成功显示了Git的版本信息,这表明Git已经被安装。 1. 使用Sourcetree SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端…

Kubernetes operator(五)api 和 apimachinery 篇

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列第五篇&#xff0c;主要对 k8s.io/api 和 k8s.io/apimachinery 两个项目 进行学习基于 kubernetes v1.24.0 代码分析Kubernetes operator学习系列 快捷链接 Kubernetes operator&a…