需求:原本是需要前端播放RTMP视频流的,但是现在的浏览器都不支持flash插件了,让用户安装flash插件也不现实,所以直接让后端将RTMP视频流转换成flv视频流给到前端进行播放。

直接上demo,直接就能播放,如果遇到播放不了就是视频流地址已失效

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>video.js播放FLV</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/4.6.1/css/bootstrap.min.css" /><link href="https://cdn.bootcdn.net/ajax/libs/video.js/7.21.0/video-js.min.css" rel="stylesheet"><style>/*剩余时长*/.video-js .vjs-remaining-time {margin-right: 7%;}/*截图按钮*/.screenshotBtn {position: absolute;top: 6px;right: 54px;}</style>
</head><body><div class="row"><div class="videoWarp col-md-4" id="videoWarp1"><video id="video1" class="video-js vjs-big-play-centered vjs-fluid" controls controlslist="nodownload"preload="auto" crossOrigin="Anonymous"></video></div></div><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/4.6.1/js/bootstrap.min.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/video.js/7.21.0/video.min.js"></script><script src="https://unpkg.com/videojs-flvjs/dist/videojs-flvjs.min.js"></script><script src="https://unpkg.com/flv.js/dist/flv.min.js"></script><script src="https://www.webrtc-experiment.com/screenshot.js"></script><script type="text/javascript">let videoUrlFLV = 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv';let videoPlayer = null;initVideoJS('video1', 'flvjs', videoUrlFLV);// 初始化Videojs插件function initVideoJS(vid, vtype, vurl) {let vSourceType = '';if (vtype === 'flvjs') {            //flv格式vSourceType = 'video/x-flv';} else {        //其它格式alert('Video Type Error ...');}videoPlayer = videojs(vid, {autoplay: true,        //自动播放controls: true,        //用户可以与之交互的控件loop: true,            //视频一结束就重新开始muted: true,           //默认情况下将使所有音频静音aspectRatio: '16:9',   //显示比率disablePictureInPicture: true,    //禁用画中画techOrder: [vtype],    //['HTML5',''flvjs'] 播放模式及顺序preload: "auto",           //预加载playsinline: true,  //解决在iPhone中播放时自动全屏问题controlBar: { // 设置控制条组件/* 设置控制条里面组件的相关属性及显示与否  */'remainingTimeDisplay': true,/* 使用children的形式可以控制每一个控件的位置,以及显示与否 */children: [{ name: 'playToggle' },                // 播放/暂停按钮{name: 'volumePanel',               // 音量控制inline: false,                             // 竖直方式},{ name: 'liveDisplay' },                    //直播流时,显示LIVE{ name: 'progressControl' },            // 播放进度条{ name: 'remainingTimeDisplay' },    // 剩余时长{ name: 'FullscreenToggle' },            // 全屏]},flvjs: {mediaDataSource: {isLive: true,cors: true,withCredentials: false,},},sources: [{ src: vurl, type: vSourceType }],}, function () {});setTimeout(() => {videoPlayer.play();addScreenshotBtnHandle()}, 500)}//视频区域禁用右键$("#video1").bind('contextmenu', function () {return false;});// 添加截图按钮function addScreenshotBtnHandle(params) {$('.vjs-control-bar').append("<div class='screenshotBtn'><svg t='1619515761104' class='icon' viewBox='0 0 1024 1024' version='1.1' xmlns='http://www.w3.org/2000/svg' p-id='11028' width='15' height='15'><path d='M512 384c55.6 0 107.8 21.6 147.1 60.9S720 536.4 720 592s-21.6 107.8-60.9 147.1S567.6 800 512 800s-107.8-21.6-147.1-60.9S304 647.6 304 592s21.6-107.8 60.9-147.1S456.4 384 512 384z m0-64c-150.2 0-272 121.8-272 272s121.8 272 272 272 272-121.8 272-272-121.8-272-272-272z' p-id='11029' fill='#ffffff'></path><path d='M650.9 128l4.4 23.6C666.7 212.1 719.6 256 781.1 256H896c35.3 0 64 28.7 64 64v512c0 35.3-28.7 64-64 64H128c-35.3 0-64-28.7-64-64V320c0-35.3 28.7-64 64-64h114.9c61.6 0 114.5-43.9 125.8-104.4l4.4-23.6h277.8z m39.8-64H333.3c-7.7 0-14.3 5.5-15.7 13.1l-11.8 62.7c-5.7 30.3-32.1 52.2-62.9 52.2H128C57.3 192 0 249.3 0 320v512c0 70.7 57.3 128 128 128h768c70.7 0 128-57.3 128-128V320c0-70.7-57.3-128-128-128H781.1c-30.8 0-57.2-21.9-62.9-52.2l-11.8-62.7c-1.4-7.6-8-13.1-15.7-13.1z' p-id='11030' fill='#ffffff'></path><path d='M224 352h-64c-17.7 0-32-14.3-32-32s14.3-32 32-32h64c17.7 0 32 14.3 32 32s-14.3 32-32 32zM512 560c17.6 0 32 14.4 32 32s-14.4 32-32 32-32-14.4-32-32 14.4-32 32-32z m0-64c-53 0-96 43-96 96s43 96 96 96 96-43 96-96-43-96-96-96z' p-id='11031' fill='#ffffff'>")}// 截图按钮点击事件$(document).on('click', '.screenshotBtn', function () {const fileType = 'png';// 找到需要截图的video标签const video = $(this).parent().siblings("video")[0];//console.log(video);video.crossOrigin = "anonymous";const canvas = document.createElement('canvas');canvas.width = video.videoWidth;canvas.height = video.videoHeight;canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);    // 图片大小和视频分辨率一致const strDataURL = canvas.toDataURL('image/' + fileType);            // canvas中video中取一帧图片并转成dataURLlet arr = strDataURL.split(','),mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]),n = bstr.length,u8arr = new Uint8Array(n)while (n--) {u8arr[n] = bstr.charCodeAt(n)}const blob = new Blob([u8arr], {type: mime})const url = window.URL.createObjectURL(blob);downloadFile(url, 'png')})// 下载截图function downloadFile(blob, fileType) {const a = document.createElement('a')a.style.display = 'none'a.href = blobconst time = new Date().getTime()a.download = `${time}.${fileType}`document.body.appendChild(a)a.click()setTimeout(function () {document.body.removeChild(a)window.URL.revokeObjectURL(blob)}, 1000)}</script>

用于测试的视频流地址,不一定有效

直播流在线测试地址 m3u8,rtsp,rtmp,flv,mp4_直播测试地址-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【拍摄学习记录】04-拍摄模式/曝光组合

曝光组合全自动半自动光圈优先手动挡【固定物体长时间不变时候、闪光灯时候、】手机上的光学变焦与数码变焦是不同的&#xff0c;使用档位推荐可以提升画质。手机夜景模式长曝光【车流轨迹、星轨】HDR 大光比【日落时候使用】专业模式&#xff0c;【感光度iso、快门可以调节】…

新liunx部署mysql过程问题

首先看下是什么发行版 cat /etc/os-release CentOS Linux 7 ################################## 使用 yum下载包 发现不行 源不行 那就换成阿里的 # 进入 yum 源配置目录 cd /etc/yum.repos.d/ # 备份所有默认 repo 文件&#xff08;以 CentOS 为例&#xff0c;其他系统…

Python 第三方库:Beautiful Soup(HTML/XML 解释提取)

Beautiful Soup 是一个 用于从 HTML 和 XML 文件中提取数据的 Python 第三方库。它为复杂的网页结构提供了简单易用的解析接口&#xff0c;尤其适合网页爬虫和数据提取任务。Beautiful Soup 提供树型结构访问、标签搜索、属性提取等功能&#xff0c;并支持多种解析器&#xff0…

使用STM32CubeMX使用CAN驱动无刷电机DJI3508

简介 文章为笔记性质 硬件包括 大疆C板 电机调速器C620 DJI3508电机 CAN知识介绍 CAN的概念 CAN是控制器区域网络&#xff08;Controller Area Network&#xff09;的缩写。CAN总线是一种适用于工业设备的高性能总线网络。说白了就是也就是一种通讯方式而已。 把多个设…

Wi-Fi 802.11s自组网/EasyMesh自组网/802.11ah物联网

一、前期调研结论 前面详细探讨了自组网和5G无线通信网络、WiFi无线通信网络的差异&#xff1a; 自组网 v.s 5G v.s WiFi-CSDN博客 从“分级道路”角度理解无线通信网络拓扑包括从当前工业应用场景具体案例了解终端无线通信网络&#xff1a; 5G无线通信网络场景&#xff08;…

【基于hyperledger fabric的教育证书管理系统】

教育证书管理系统 系统概述 项目背景 随着数字化转型的深入推进&#xff0c;教育证书作为个人学术成就和专业资质的重要凭证&#xff0c;在就业市场、高等教育和职业发展中扮演着关键角色。然而&#xff0c;传统教育证书管理体系面临着数据孤岛、证书伪造、验证流程繁琐以及跨机…

【Flask】测试平台开发,集成禅道

概述&#xff1a; 由于公司多数测试人员还是在使用禅道&#xff0c;为了方便&#xff0c;就将禅道直接集成在我们的测试平台中 一般可以有几种实现方法 调用禅道的API集成集成本地部署的禅道-可能有跨域问题&#xff0c;需要解决 由于我这里已经部署了一台本地的禅道系统&…

《UE5_C++多人TPS完整教程》学习笔记45 ——《P46 待机与跳跃(Idle And Jumps)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P46 待机与跳跃&#xff08;Idle And Jumps&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; St…

用html+js下拉菜单的demo,当鼠标点击后展开,鼠标点击别的地方后折叠

使用html js实现下拉菜单demo&#xff0c;因为copy的网站菜单功能失效&#xff0c;就需要自己写一个逻辑&#xff0c;点击其他区域折叠菜单&#xff0c;可以参考&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF…

OpenCV 核心技术:颜色检测与几何变换实战

在计算机视觉任务中&#xff0c;颜色空间转换和图像几何变换是两大基础且高频的操作 —— 前者用于精准分割特定颜色目标&#xff08;如交通信号灯、物体追踪&#xff09;&#xff0c;后者用于调整图像的尺寸、位置和视角&#xff08;如文档矫正、图像拼接&#xff09;。本文将…

[HFCTF2020]EasyLogin

文章目录TRYWP总结TRY 注册admin报错username wrong。 随便注册一个用户点击GetFlag&#xff0c;permission deny。 猜测可能是需要admin权限。 看cookie发现有&#xff1a; sses:aok&#xff1a;eyJ1c2VybmFtZSI6ImEiLCJfZXhwaXJlIjoxNzU2NDU1NjczMTAxLCJfbWF4QWdlIjo4NjQwM…

Java接口和抽象类的区别,并举例说明

Java接口和抽象类是面向对象编程中实现抽象的两种机制&#xff0c;它们在语法、设计目的和使用场景上有显著区别&#xff1a;一、核心区别‌定义方式‌抽象类&#xff1a;使用abstract class声明&#xff0c;可包含抽象方法和具体方法45。接口&#xff1a;使用interface声明&am…

docker-相关笔记

1: 导入镜像 docker load -i myimage.tar# 导出镜像 docker save myimage:latest > myimage.tar # 导入镜像 docker load -i myimage.tardocker load -i <文件> 功能&#xff1a;用于导入通过 docker save 命令导出的镜像归档文件&#xff08;通常是 .tar 格式&#…

自然语言提取PDF表格数据

自然语言提取PDF表格数据PDF v8.2的文档解决方案与OpenAI实现了无缝的AI集成&#xff0c;可将非结构化PDF转换为可用数据。MESCIUS 推出的 PDF 文档解决方案 (DsPdf) 是一款软件开发工具包&#xff0c;它提供了 .NET Core 库和一个 JavaScript PDF 查看器&#xff0c;用于处理和…

飞牛Nas每天定时加密数据备份到网盘,基于restic的Backrest笔记分享

1. 前言 受前辈“RAID≠备份”的经验&#xff0c;也考虑到硬盘故障时 RAID 重建步骤繁琐&#xff0c;我干脆放弃阵列&#xff0c;直接单盘运行。 重要数据则加密后上传至大厂云盘&#xff1a;一方面文件对外不可读&#xff0c;规避扫描和谐&#xff1b;另一方面依靠大厂的数据安…

C#连接SQL-Server数据库超详细讲解以及防SQL注入

C#连接SQL Server数据库完整指南&#xff0c;整合了ADO.NET原生连接与Entity Framework Core两种实现方式。这篇文件详细介绍C#代码连接数据库的通用操作数据库链接功能 数据库的增删改查操作1 配置全局数据库链接字符串 App.config2 获取数据库链接字符串先在App.config配置连…

Pico2‑ICE FPGA 开发板:从开箱到跑通示例的全历程

FPGA 和 MCU 结合的开发板不多&#xff0c;而 Pico2‑ICE 则把小巧、灵活和易上手完美结合。搭载 RP2350 双核 RISC-V MCU Lattice iCE40UP5K FPGA&#xff0c;配合官方 SDK&#xff0c;你可以一步步跑通各种示例&#xff0c;从 LED 到 VGA&#xff0c;再到 MCU 与 FPGA 协作应…

Java图形图像处理【Swing图像拖拽】【五】

Java图形图像处理【Swing图像拖拽】 18.3.3 Swing图像对象拖拽功能 18.3.3 Swing图像对象拖拽功能 上文讨论的是java.awt.dnd包中提供的拖拽API接口&#xff0c;也可称之为AWT组件的拖拽功能。下面我们要讨论的是Swing框架的拖拽功能&#xff1a;Swing组件也提供了对拖拽功能的…

状态模式与几个经典的C++例子

1. 状态模式定义与核心思想 状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。通过将状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。 核心思想: 状态抽象:将对象的每个状态都封装到一个独立的类中。 委托代替条件判断:…

SyncBackPro 备份及同步软件中的脚本功能简介

脚本提供了一种灵活而简单的方法来自动执行任务和扩展应用程序的功能。脚本是一个小程序&#xff0c;能够自定义和控制备份作业。例如&#xff0c;用户可以编写脚本来复制、重命名或删除特定文件、自定义用户界面或更改配置文件设置。SyncBackPro 的脚本功能类似于 Microsoft O…