Web端H5播放FLV、HLS、MP4 (二)

news2024/11/28 10:53:19

使用video.js播放HLS、FLV、MP4。

MP4、FLV、HLS、RTMP等协协和播放器之间的支持情况,参看这里。
在这里插入图片描述

一、主要JS插件:

  • jquery(v3.6.0)

  • video.js (v7.21.0,其它版本没试)
    https://cdn.bootcdn.net/ajax/libs/video.js/7.21.0/video.min.js

  • flv.js (v4.2.8)
    https://unpkg.com/flv.js/dist/flv.min.js

  • screenshot.js (Last time updated at August 04, 2017, 08:32:23)
    https://www.webrtc-experiment.com/screenshot.js

二、demo代码。

  1. 具体步骤见demo说明。
  2. 附带截图功能。
  3. PC端Chrome/Firefox/Edge等标准浏览器调试没问题。
  4. demo要放到web服务环境。

在这里插入图片描述

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>video.js播放HLS、FLV、MP4</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>
		body{
			margin:2rem;
		}
		.videoWarp {
			/*
			width: 30px;
			height: 20px;
			*/
		}
		/*进度条
		.video-js .vjs-progress-control {
			opacity: 1 !important;
			margin-right:9%;
		}
		*/
		/*剩余时长*/
		.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 class="videoWarp col-md-4" id="videoWarp2">
		<video id="video2" class="video-js vjs-big-play-centered vjs-fluid" controls controlslist="nodownload" preload="auto" crossOrigin="Anonymous"></video>
	</div>
	<div class="videoWarp col-md-4" id="videoWarp3">
		<video id="video3" class="video-js vjs-big-play-centered vjs-fluid" controls controlslist="nodownload" preload="auto" crossOrigin="Anonymous"></video>
	</div>
</div>

<div class="row">
	<div class="col-md-4" id="">
		<h2>FLV</h2>
	</div>
	<div class="col-md-4" id="">
		<h2>HLS</h2>
	</div>
	<div class="col-md-4" id="">
		<h2>MP4</h2>
	</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-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv';
		let videoUrlHLS = 'http://219.151.31.38/liveplay-kk.rtxapp.com/live/program/live/hnwshd/4000000/mnf.m3u8';
		let videoUrlmp4 = 'http://vjs.zencdn.net/v/oceans.mp4';
		let videoPlayer = null;
		
		initVideoJS('video1','flvjs',videoUrlFLV);
		initVideoJS('video2','html5',videoUrlHLS);
		initVideoJS('video3','html5',videoUrlmp4);

		// 初始化Videojs插件
		function initVideoJS(vid,vtype,vurl) {
			let vSourceType ='';
			if (vtype === 'flvjs') {			//flv格式
				vSourceType = 'video/x-flv';
			} else if ((vtype === 'html5') && (vurl.substring(vurl.lastIndexOf(".") + 1) === "m3u8")) {		//hls格式
				vSourceType = 'application/x-mpegURL';
			} else if ((vtype === 'html5') && (vurl.substring(vurl.lastIndexOf(".") + 1) === "mp4")) {		//mp4格式
				vSourceType = 'video/mp4';
			} 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, #video2, #video3").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'></path></svg></div>")
		}

		// 截图按钮点击事件
		$(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中取一帧图片并转成dataURL

			let 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 = blob
			const 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>
</body>
</html>

测试公用资源(发时可用)

RTSP
rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mp4
rtsp://213.34.225.97/axis-media/media.amp
rtsp://37.157.51.30/axis-media/media.amp
rtsp://71.83.5.156/axis-media/media.amp

FLV
https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv
https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-720p.flv
https://www.sample-videos.com/video123/flv/720/big_buck_bunny_720p_1mb.flv

HLS
http://219.151.31.38/liveplay-kk.rtxapp.com/live/program/live/hnwshd/4000000/mnf.m3u8
http://playertest.longtailvideo.com/adaptive/bipbop/gear4/prog_index.m3u8
http://hls01open.ys7.com/openlive/f65a2cc9f9d9453fb349a338824efb9f.m3u8
http://hls01open.ys7.com/openlive/90ffd8fac3bb486b83cb1fa5cb0553f6.m3u8

RTMP
rtmp://mobliestream.c3tv.com:554/live/goodtv.sdp
rtmp://ns8.indexforce.com/home/mystream

MP4
http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4
http://vjs.zencdn.net/v/oceans.mp4
https://media.w3.org/2010/05/sintel/trailer.mp4

参考:

https://blog.csdn.net/weixin_45264424/article/details/127566450

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

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

相关文章

基于FPGA的RGB转HSV图像算法设计

一、什么是HSV色彩空间&#xff1f; RGB色彩空间是基于三基色而言&#xff0c;即红色、绿色、蓝色。而HSV色彩空间则是基于色调、饱和度和亮度而言的。 色调&#xff08;H&#xff09;是指光的颜色&#xff0c;例如&#xff0c;彩虹中的赤&#xff0c;橙&#xff0c;黄&#…

如何自学黑客?自学黑客技术需要学多久?

问题一&#xff1a;黑客如何学起&#xff1f; 答&#xff1a;必须从学习者的角度来看&#xff0c;如果你是一个已经学过编程&#xff0c;通晓几门语言的人那么这个答案就会和一个从没有接触过的计算机&#xff0c;甚至连什么叫高级语言还不知道的人有所区别的对待。 这就像是登…

LeetCode題目笔记——面试题 01.01. 判定字符是否唯一

文章目录题目描述题目难度——简单方法一&#xff1a;使用集合代码/Python方法二——用一个数组代码/Python方法三——位运算代码/Python总结题目描述 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a; 输入: s “leetcode” 输出: …

nvm 实战过程

文章目录前情提要应用场景实战解析最后前情提要 nvm是什么&#xff1a; nvm 全名 node.js version management&#xff0c;顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 应用场景 在我们前端工程师的日常工作中&#xff0c;不免要与不同基于n…

解决JavaWeb报错:此处不允许注解

目录 前言必读 一、遇到问题 二、解决办法 前言必读 读者手册&#xff08;必读&#xff09;_云边的快乐猫的博客-CSDN博客 一、遇到问题 1.在使用时候会发现报错为此处不允许使用注解&#xff0c;其实这是粗心和不熟练使用导致的 二、解决办法 2.把WebServlet("/ddd&…

【基于多尺度的融合:IVIF】

Infrared and visible image fusion via gradientlet filter &#xff08;基于梯度波滤波器的红外与可见光图像融合&#xff09; 本文从亮度和梯度分离的角度出发&#xff0c;提出了一种基于模糊梯度阈值函数和全局优化的图像滤波器梯度小波滤波器。它可以在保持图像的整体亮…

android aidl使用demo

android使用aidl原理 参考链接: https://www.twle.cn/l/yufei/android/android-basic-service-aidl.html 通过这部分代码, 加深对Android AIDL的理解 aidl server端 ILanguage.aidl 步骤: 在main目录下创建aidl文件夹, 并创建对应的包 com.example.aidl, 然后创建ILanguage.ai…

分享5款好用但一直不火的宝藏软件

很多软件用起来很好用&#xff0c;但是由于这样那样的原因&#xff0c;一直没什么知名度&#xff0c;但是不代表它们不好用&#xff0c;我的任务就是把这些宝藏分享给大家。 1.系统字体美化——MacType MacType是一款非常著名的系统字体美化软件&#xff0c;相比 GDI 更加容易…

【JVM故障问题排查心得】「内存诊断系列」Docker容器经常被kill掉,k8s中该节点的pod也被驱赶,怎么分析?

背景介绍 最近的docker容器经常被kill掉&#xff0c;k8s中该节点的pod也被驱赶。 我有一个在主机中运行的Docker容器&#xff08;也有在同一主机中运行的其他容器&#xff09;。该Docker容器中的应用程序将会计算数据和流式处理&#xff0c;这可能会消耗大量内存。 该容器会不…

操作系统之线程和进程

文章目录一. 什么是操作系统二. 进程和线程1. 进程2. 线程3. 进程的管理3.1 PBC中的一些属性3.2 并发和并行3.3 进程的调度3.4 内存管理3.5 进程间的通信3.6 并发编程4. 进程与线程的区别一. 什么是操作系统 操作系统本质上是一个软件, 发挥的是管理作用, 可以管理软件和硬件,…

《Python多人游戏项目实战》第二节 使用pickle模块序列化数据

目录 2.1 设置游戏窗口 2.2 实现人物移动的功能 2.3 编写服务端代码 2.4 完善客户端代码 2.5 完整代码下载地址 在本节&#xff0c;笔者会带大家开发一个联机版的人物移动程序&#xff0c;示例如下&#xff1a; 在上一节&#xff0c;客户端和服务端通信的JSON数据中包含玩…

CentOS7中安装字体库中文字体

若存在中文乱码的情况&#xff0c;这是因为操作系统中没有安装中文字体。 安装字体库 yum install fontconfig -y 安装更新字体命令 yum install mkfontscale -y添加中文字体 # 新建目录 mkdir /usr/share/fonts/chinese # 切换到中文字体目录下&#xff0c;上传windows里宋…

浅谈人工智能生成内容(AIGC)

兴趣了解 [OpenAI ]人工智能绘画产品 DALLE: 在计算机上输入一句话&#xff0c;DALLE 就能够理解这句话、然后自动生成一幅意思相应的图像&#xff0c;且该图像是全网首发、独一无二。[谷歌 ] 5400 亿参数大模型 PaLM: PaLM 的文本理解能力与逻辑推理能力大幅提升&#xff0c;…

[附源码]Nodejs计算机毕业设计基于web的校园闲置物品交易系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

PyTorch中利用LSTMCell搭建多层LSTM实现时间序列预测

前言 前面已经写过不少时间序列预测的文章&#xff1a; 深入理解PyTorch中LSTM的输入和输出&#xff08;从input输入到Linear输出&#xff09;PyTorch搭建LSTM实现时间序列预测&#xff08;负荷预测&#xff09;PyTorch中利用LSTMCell搭建多层LSTM实现时间序列预测PyTorch搭建…

为什么AI距离智能越来越远?

2021年讨论了人机混合智能里的深度态势感知和人的算计与机器的计算如何结合的问题。之后有一位朋友问了我五个问题。第一&#xff0c;关于数学和逻辑的关系问题。这个问题是百年来数学的基础问题&#xff0c;迄今为止似乎没有定论。从实用主义角度说&#xff0c;“把数学等同于…

企业在项目中采用工时管理系统的好处

在如今疫情的影响下&#xff0c;不少企业面对经济形势愈发严峻的情况下&#xff0c;对项目员工工时的管理也是越来越注重。如何在确保企业正常运转的前提下提升企业发展空间&#xff0c;人员降低工作成本呢&#xff1f;根据目前研究表明&#xff0c;很多企业都选择使用项目工时…

Android Kotlin使用AspectJ进行AOP面向切面编程

前言 什么是面向切面编程&#xff1f;首先我们来了解下两个概念&#xff1a; OOP&#xff08;面向对象编程&#xff09;:针对业务处理过程的实体及其属性和行为进行抽象封装&#xff0c;以获得更加清晰高效的逻辑单元划分。 AOP(面向切面编程)&#xff1a;则是针对业务处理过程…

html好看的生日祝福,生日表白(源码)

文章目录1.设计来源1.1 主界面1.2 秘密基地1.3 甜言蜜语2.效果和源码2.1 动态效果2.2 源代码2.3 自定义背景图片代码2.4 自定义每次生日记录代码2.5 自定义背景音乐代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/de…

Java实现Google第三方登录

文章目录前言一、了解OAuth2.0二、注册开发者账号1.登录开发者平台2.创建应用三、代码实现1.实现流程1.点击登录2.接受回调中的code获取accessToken3.获取用户信息2.注意事项前言 Google API 使用 OAuth 2.0 协议进行身份验证和授权。Google 支持常见的 OAuth 2.0 场景&#x…