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

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.mfbz.cn/a/367164.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go_view同后端集成时的注意事项

goview是一个不错的可视化大屏配置工具;提供了丰富的功能可供调用。 官方地址和文档: https://gitee.com/dromara/go-view https://www.mtruning.club/guide/start/ 同nodejs集成可参考;https://gitee.com/qwdingyu/led (建议–后端集成有api功能,可直接配置sql)同dotne…

Leetcode—203. 移除链表元素【简单】

2024每日刷题&#xff08;一零九&#xff09; Leetcode—203. 移除链表元素 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(n…

Python爬虫的基本原理

我们可以把互联网比作一张大网&#xff0c;而爬虫&#xff08;即网络爬虫&#xff09;便是在网上爬行的蜘蛛。把网的节点比作一个个网页&#xff0c;爬虫爬到这就相当于访问了该页面&#xff0c;获取了其信息。可以把节点间的连线比作网页与网页之间的链接关系&#xff0c;这样…

ref和reactive

看尤雨溪说&#xff1a;为什么Vue3 中应该使用 Ref 而不是 Reactive&#xff1f;

华为1.24秋招笔试题

华为1.24秋招笔试题 1.题目1 题目详情 - 2024.1.24-华为秋招笔试-第一题-计算积分 - CodeFun2000 1.1题解 import java.util.Scanner;class Main{public static void main(String[] args){Scanner scnew Scanner(System.in);String ssc.next();char[] chs.toCharArray();in…

记一次 Android CPU高使用率排查

文章目录 背景排查高占用的进程adb shelltoptop -b -H -n 1 | grep 29337 (打印各线程 cpu使用详情)kill -3 29337 (生成trace文件)adb pull /data/anr /Users/gerry.liang/Desktop定位问题 补充说明: 背景 测试同学反馈我们的App CPU使用率 90% 居高不下,经过一番艰难的排查后…

如何在PS5上使用金手指修改游戏

环境&#xff1a;windows PS5 问题&#xff1a;PS5 没有GodHen&#xff0c;无法使用json金手指&#xff0c;PKG金手指比较少 解决办法&#xff1a;使用MultiTrainerv从网络注入PS5&#xff0c;修改进程内存 背景&#xff1a;为了护肝&#xff0c;拒绝刷刷刷 解决过程&#xff…

网络异常案例四_IP异常

问题现象 终端设备离线&#xff0c;现场根据设备ip&#xff0c;ping不通。查看路由器。 同一个路由器显示的终端设备&#xff08;走同一个wifi模块接入&#xff09;&#xff0c;包含不同网段的ip。 现场是基于三层的无线漫游&#xff0c;多个路由器wifi配置了相同的ssid信息&a…

VUE项目导出excel

导出excel主要可分为以下两种&#xff1a; 1. 后端主导实现 流程&#xff1a;前端调用到导出excel接口 -> 后端返回excel文件流 -> 浏览器会识别并自动下载 场景&#xff1a;大部分场景都有后端来做 2. 前端主导实现 流程&#xff1a;前端获取要导出的数据 -> 把常规数…

部署实战--修改jar中的文件并重新打包成jar文件

一.jar文件 JAR 文件就是 Java Archive &#xff08; Java 档案文件&#xff09;&#xff0c;它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中&#xff0c;多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…

Redis -- list列表

只有克服了情感的波动&#xff0c;才能专心致志地追求事业的成功 目录 列表 list命令 lpush lpushx rpush rpushx lrange lpop rpop lindex linsert llen lrem ltrim 阻塞命令 小结 列表 列表相当于 数组或者顺序表。 列表类型是用来存储多个有序的字符串&…

Javascript | JS如何断点测试(WebStorm)

JavaScript的断点与之前所学到的Java和python在jetbrain系列编辑器中的断点debug不太一样&#xff0c;往常我们在编写python的时候用pycharm的时候是直接断点进入debug的&#xff0c;就像下面这样 只要直接在代码中断点&#xff0c;然后运行debug功能即可 但是在WebStorm中不是…

delete、truncate和drop区别

一、从执行速度上来说 drop > truncate >> DELETE 二、从原理上讲 1、DELETE DELETE from TABLE_NAME where xxx1.1、DELETE属于数据库DML操作语言&#xff0c;只删除数据不删除表的结构&#xff0c;会走事务&#xff0c;执行时会触发trigger&#xff08; 触发器…

jsp粉丝社区系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 粉丝社区系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

BEV感知(2)--转换模块

目录 一、2D到3D转换模块 1、LSS 2、Pseudo LiDAR 二、3D到2D转换模块 1、Explicit mapping 2、Implicit mapping 三、transformer相关 1、VIT 2、Swin Transformer 一、2D到3D转换模块 核心目的&#xff1a;由于将2D空间转换到BEV&#xff0c;所以我们要引入一个媒…

导出pdf 加密、加水印、加页脚

1.依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.10</version> </dependency> <dependency> …

2024美赛ABCDEF题成品参考论文+配套数据代码+参考文献

社区抗灾能力综合评估与决策模型研究&#xff08;其余题目都在文末&#xff09; 摘要&#xff1a;社区抗灾能力的提升对于灾害风险管理至关重要。本研究基于机器学 习方法&#xff0c;构建了社区抗灾能力预测模型&#xff0c;以评估社区在灾害事件中的表现。首先&#xff0c; 我…

20240202在WIN10下使用whisper.cpp

20240202在WIN10下使用whisper.cpp 2024/2/2 14:15 【结论&#xff1a;在Windows10下&#xff0c;确认large模式识别7分钟中文视频&#xff0c;需要83.7284 seconds&#xff0c;需要大概1.5分钟&#xff01;效率太差&#xff01;】 83.7284/4200.1993533333333333333333333333…

断路精灵:探秘Sentinel熔断策略的神奇效果

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 断路精灵&#xff1a;探秘Sentinel熔断策略的神奇效果 前言熔断策略基础&#xff1a;数字断路精灵的初见熔断策略的基本原理&#xff1a;简单示例演示熔断策略的基本用法&#xff1a; 慢调用比例熔断策…

STM32之IIC总线控制ATC24C04

一、存储器介绍 1、电子密码存储概述 单片机的电子密码存储是一种将密码信息以电子形式存储在单片机内部的技术。它通常用于需要保护敏感信息或限制访问权限的应用程序&#xff0c;如安全系统、门禁系统、电子锁等。 电子密码存储可以通过多种方式实现&#xff0c;以下是其中…
最新文章