Html5如何播放hls格式的视频

目录

一、什么情况下需要播放

二、hls的原理

1、 切片

2、编码

3、分发

4、M3U8文件

5、客户端请求

6、动态码率调整

7、缓存

8、实时性

三、方法一:使用hls.js播放

 四、方法二:使用video.js播放


一、什么情况下需要播放

当前端需要嵌入设备视频,比如用到魔镜、萤石云、海康威视等平台,怎么能将视频地址在前端页面中播放呢,这里要引用视频播放的js。

一般hls格式的视频有http、https,根据平台提供的接口获取视频url,文件名是m3u8。hls的视频地址示例:

https://cdn.jsdelivr.net/gh/skyxingcheng/ic-cdn@master/static/media/TheWindRises_mv/210314.m3u8

二、hls的原理

HLS(HTTP Live Streaming)是一种基于HTTP协议的流媒体传输协议,它的出现使得视频的传输更加稳定和可靠。HLS通过将整个视频分成一系列小的分片,并通过HTTP协议进行传输,从而实现了视频的实时播放和边下边播的功能。


工作原理:

1、 切片

在HLS中,视频被切分成多个小的分片,每个分片通常持续几秒钟。这样做的好处是,可以将视频分片缓存在客户端,从而降低了服务端的压力。

2、编码

在切片之前,视频需要进行编码。常见的编码格式有H.264和H.265等。编码的目的是将视频数据压缩,以便更好地适应网络传输。

3、分发

切片好的视频分发到一个或多个服务器上。这些服务器可以是CDN(内容分发网络)服务器,也可以是普通的HTTP服务器。

4、M3U8文件

服务器会生成一个.m3u8文件,该文件是一个索引文件,包含了所有视频分片的URL。客户端通过下载该文件来获取视频分片的地址。

5、客户端请求

客户端通过HTTP请求.m3u8文件,并从中获取到视频分片的地址。然后,客户端会根据这些地址逐个请求视频分片。

6、动态码率调整

HLS支持动态码率调整,这意味着客户端可以根据当前网络情况选择合适的视频分片进行播放。如果网络带宽足够,客户端可以选择高质量的分片进行播放;如果网络带宽不足,客户端可以选择低质量的分片进行播放。

7、缓存

客户端会将下载的视频分片进行缓存,以便实现边下边播的功能。当用户播放视频时,客户端会从缓存中读取视频数据进行播放。

8、实时性

由于视频被切分成多个小的分片,客户端可以实时地获取最新的视频分片。这意味着,即使视频在服务端还没有完全生成,客户端也可以开始播放已经生成的分片。

三、方法一:使用hls.js播放

需要引用hls.js

<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>

全部代码如下:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>视频播放</title><script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
</head>
<body>
<video id="HLS_Player" autoplay="autoplay" loop muted controls="controls" width="100%" height="100%"></video>
<script type="text/javascript" >HLS_Player = document.getElementById('HLS_Player');if (Hls.isSupported()) {HLS_Controller = new Hls();HLS_Controller.loadSource("https://cdn.jsdelivr.net/gh/skyxingcheng/ic-cdn@master/static/media/TheWindRises_mv/210314.m3u8")HLS_Controller.attachMedia(HLS_Player);HLS_Controller.on(Hls.Events.MANIFEST_PARSED, function() {HLS_Player.play();});} else if (HLS_Player.canPlayType('application/vnd.apple.mpegurl')) {HLS_Player.src = '';HLS_Player.addEventListener('loadedmetadata', function() {HLS_Player.play();});}
</script>
</body>
</html>

运行结果:

 由于hls是对视频进行切片,所以隔几秒hls.js里就会对url进行一次请求。

 四、方法二:使用video.js播放

需要引用一下js和css文件.

<script src="https://cdn.bootcss.com/video.js/6.0.0-RC.5/video.js"></script>
<link href="https://cdn.bootcss.com/video.js/6.0.0-RC.5/alt/video-js-cdn.min.css" rel="stylesheet">
<!-- PC 端浏览器不支持播放 hls 文件(m3u8), 需要 videojs-contrib-hls 来给我们解码 -->
<script src="https://cdn.bootcss.com/videojs-contrib-hls/5.3.3/videojs-contrib-hls.js"></script>

全部代码如下:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>视频播放</title><script src="https://cdn.bootcss.com/video.js/6.0.0-RC.5/video.js"></script><link href="https://cdn.bootcss.com/video.js/6.0.0-RC.5/alt/video-js-cdn.min.css" rel="stylesheet"><!-- PC 端浏览器不支持播放 hls 文件(m3u8), 需要 videojs-contrib-hls 来给我们解码 --><script src="https://cdn.bootcss.com/videojs-contrib-hls/5.3.3/videojs-contrib-hls.js"></script>
</head>
<body>
<div class="video" style="width: 100%;height: 60vh"><video id="example-video" class="video-js vjs-default-skin  vjs-big-play-centered"  style="width: 100%;height: 100%" playsinline webkit-playsinlineautoplay controls preload="auto"x-webkit-airplay="true" x5-video-player-fullscreen="true" x5-video-player-typ="h5"><source id="hls-source" src=""></video>
</div>
<script type="text/javascript" >var player = window.player = videojs('example-video');player.src({src:'https://cdn.jsdelivr.net/gh/skyxingcheng/ic-cdn@master/static/media/TheWindRises_mv/210314.m3u8',type: 'application/x-mpegURL'});player.play();</script>
</body>
</html>

运行结果:

 运行的视频不自动播放,且报错,需要手动点击才能播放。

原因是网页加载完成后立即播放音频(或带有音频轨道的视频)可能会意外地打扰到用户,为了增加用户体验,紧接着2018年4月份Chrome发布的66版本也正式关闭了声音自动播放。

解决方案:

一:设置静音

audio的muted设置为true,让用户自己点击查看

 代码中这样改:

    <video id="example-video" class="video-js vjs-default-skin  vjs-big-play-centered"  style="width: 100%;height: 100%" mutedplaysinline webkit-playsinlineautoplay controls preload="auto"x-webkit-airplay="true" x5-video-player-fullscreen="true" x5-video-player-typ="h5"><source id="hls-source" src=""></video>

二、用户和网页已有交互行为(包括点击、触摸、按下某个键等等)

我这里是改成静音了,运行结果:

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

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

相关文章

[数组] 子数组最大平均数

给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你找出平均数最大且 长度为 k 的连续子数组&#xff0c;并输出该最大平均数。 任何误差小于 10-5 的答案都将被视为正确答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,12,-5,-6,50,3], k 4 输出&#xff…

操作系统教材第6版——个人笔记5

3.2 单连续分区存储管理 3.2.1 单连续分区存储管理 单连续分区存储管理 每个进程占用一个物理上完全连续的存储空间(区域) 单用户连续分区存储管理固定分区存储管理可变分区存储管理 单用户连续分区存储管理 主存区域划分为系统区与用户区设置一个栅栏寄存器界分两个区域…

每日题库:Huawe数通HCIA——13

所有资料均来源自网络&#xff0c;但个人亲测有效&#xff0c;特来分享&#xff0c;希望各位能拿到好成绩&#xff01; PS&#xff1a;别忘了一件三连哈&#xff01; 今日题库&#xff1a; 186. 下列协议中属于动态IGP路由协议的是&#xff1f;-单选 A.stA.tiC. B.OSPF c…

使用Django Channels和WebSocket构建聊天应用

一、引言 WebSocket提供了一种在客户端和服务器之间进行实时双向通信的方式。结合Django Channels&#xff0c;我们可以轻松地在Django项目中实现WebSocket功能。本文将通过一个简单的聊天应用示例&#xff0c;展示如何使用Django Channels和WebSocket。 二、环境搭建 项目的…

Nacos的下载使用

下载 本地Java8Maven环境 下载地址 https://github.com/alibaba/nacos/releases使用 解压安装包&#xff0c;直接运行bin目录下的startup.cmd 账号密码都是nacos

Win32和c++11多线程

Win32和c11多线程 一、概念1.线程的特点线程内核对象线程控制块线程是独立调度和分派的基本单位共享进程的资源 2.线程的上下文切换引起上下文切换的原因 3.线程的状态 二、Windows多线程API1.CreateThread创建线程2.获取线程ID3.关闭线程句柄4.挂起线程5.恢复线程6.休眠线程的…

算法金 | 读者问了个关于深度学习卷积神经网络(CNN)核心概念的问题

​大侠幸会&#xff0c;在下全网同名[算法金] 0 基础转 AI 上岸&#xff0c;多个算法赛 Top [日更万日&#xff0c;让更多人享受智能乐趣] 读者问了个关于卷积神经网络核心概念的问题&#xff0c;如下&#xff0c; 【问】神经元、权重、激活函数、参数、图片尺寸&#xff0c;卷…

手机相册的排列方式探讨

不论你是不是程序员&#xff0c;你一定留意过一个问题&#xff1a;相册 App 基本都将图片裁剪成了居中的 1:1 正方形。那么手机相册 App&#xff0c;为什么要将图片切割成 1:1 正方形&#xff0c;然后以网格排列&#xff1f;是行业标准吗&#xff1f; 自适应图片宽度的图库&a…

vscode 离线下载指定版本插件和安装方法

1、背景 由于不同的vscode版本需要安装对应的插件版本&#xff0c;一般情况下&#xff0c;vscode版本会落后于vscode插件库提供的可以下载的插件版本&#xff0c;网页一般只会提供最新的插件下载版本&#xff0c;因此我们需要下载指定的版本需要采取一些措施。 2、获取需要安…

c语言速成系列指针上篇

那么这一篇文章带大家学习一下c语言的指针的概念、使用、以及一些注意事项。 指针的概念 指针也就是内存地址&#xff0c;指针变量是用来存放内存地址的变量。就像其他变量或常量一样&#xff0c;您必须在使用指针存储其他变量地址之前&#xff0c;对其进行声明。 大白话讲解…

【数据集划分】oracle数据集划分(总结版)

【数据集划分】假如你有接近百万条oracle数据库数据&#xff08;成真版&#xff09; 写在最前面最终代码原理&#xff1a;生成随机索引并打乱顺序示例作用应用场景 遇到报错&#xff1a;ORA-01795&#xff0c;通过CTE&#xff08;Common Table Expressions&#xff09;和窗口函…

Next.js Tailwind CSS UI组件

摘要&#xff1a; 官网 今天公司使用到一个前端ui框架——Next.js Tailwind CSS UI组件&#xff01;这从头构建一个AI驱动的前端UI组件生成器&#xff0c;生成Next.js Tailwind CSS UI组件&#xff1a; 1、用Next.js、ts和Tailwind CSS构建UI组件生成器Web应用程序。 2、用Copi…

08-指针与数组的结合——数组指针与指针数组的区别

指针与数组的结合 示例 1:指针访问数组元素 通过指针访问数组元素的例子&#xff1a; #include <stdio.h>int main() {int arr[5] {1,2,3,4,5};//int *p1 &arr;int *p1 (int *)&arr; // 需要强制类型转换int *p2 arr;printf("*p1:%d\n", *(p1 …

Python第二语言(四、Python数据容器)

目录 一、 数据容器&#xff08;list、tuple、str、map、dict&#xff09; 1. 数据容器概念 2. 列表list&#xff08; [] &#xff09; 2.1 定义方式 2.2 嵌套列表 2.3 list通过获取下标索引获取值 2.4 下标使用概念 2.5 list列表的使用&#xff08;列表的方法&#xff…

​在 The Sandbox 元宇宙的 CU 超商中寻找Milk币!

CU&#xff08;韩国领先的便利店&#xff09;和 MiL.k&#xff08;基于区块链的忠诚度整合平台&#xff09;合作在 The Sandbox 推出了首款元宇宙游戏&#xff0c;通过独家活动在 Web2 和 Web3 之间建立联系。 在元宇宙中玩转 “Play CU X MiL.k” 体验 通过引人入胜的游戏内容…

Apple开发者证书创建完整过程

1.创建CSR文件: 打开钥匙串访问程序 选择从证书颁发机构请求 创建证书 保存CSR文件到桌面 成功如下: 开始创建证书: 选择

每天一道大厂SQL题【Day32】按消息量给广东省qq打标记

文章目录 每天一道大厂SQL题【Day32】按消息量给广东省qq打标记每日语录第32题 需求三&#xff1a;按消息量给广东省qq打标记思路分析附表 答案获取加技术群讨论文末SQL小技巧 后记 每天一道大厂SQL题【Day32】按消息量给广东省qq打标记 大家好&#xff0c;我是Maynor。相信大…

vue3引入cesium和olcs

首先引入包 pnpm i olcs; pnpm i -D vite-plugin-cesium pnpm i -S cesium在vite.config.js中配置&#xff0c;参考这位大佬的笔记 添加链接描述 import { defineConfig } from vite import vue from vitejs/plugin-vue import cesium from vite-plugin-cesium; // https://…

芝麻IP好用吗?来测试了!

作为老牌代理IP服务厂商&#xff0c;芝麻IP和青果网络代理IP都做的不错&#xff0c;市场上几乎可以是有口皆碑了&#xff0c;上次测试了青果网络的代理IP&#xff0c;效果表现得还挺不错&#xff0c;和他们自己宣传的以及客户对他们的评价大差不差。 总的来说&#xff0c;他们家…

开机弹窗找不到opencl.dll怎么办,教你几种有效的修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到opencl.dll文件”。这个问题可能会影响到我们的正常使用&#xff0c;因此了解其原因和解决方法是非常必要的。本文将从多个方面对“找不到opencl.dll文件”这一问题进行详细分析和解…