当前位置: 首页 > 编程日记 > 正文

使用html5进行视频播放

一直以来网页大多是使用 flash 来播放视频。在目前唱衰 flash 的环境下,HTML5 为我们带来了一个网页内视频播放的解决方案—— <video>标签。

在HTML5 中,可以通过HTML标签“audio”和“video”来支持嵌入式的媒体,使开发者能够方便地将媒体嵌入到HTML文档中。

视频格式

当前,video 元素支持三种视频格式:

  • Ogg = 带有 Theora 视频编码和 Vorbis 音频编码的 Ogg 文件
  • MPEG4 = 带有 H.264 视频编码和 AAC 音频编码的 MPEG 4 文件
  • WebM = 带有 VP8 视频编码和 Vorbis 音频编码的 WebM 文件

嵌入媒体

html5嵌入媒体就和使用 <img> 标签嵌入图片一样简单,你只需要一个 <video> 标签就可以:

<video src="../video/2.ogg" controls>
</video>

src 属性来指定想要播放的视频文件,controls 属性可以显示视频播放控件(默认不显示)。

可以在 <video> 标签中设置内容,这些内容将在浏览器不支持 <video> 时展示:

<audio src="audio.ogg" controls autoplay loop>
<p>你的浏览器不支持video标签</p>
</audio>

播放属性

video 标签中可以设置一些属性来对播放器进行简单的控制。

比如规定播放器大小为640px * 480px:

<video src="../video/2.ogg" height="480" width="640" controls><p>你的浏览器不支持video标签</p>
</video>

height 和 width 属性的单位都是 pixels, 即像素。如果设置这些属性,在页面加载时会为视频预留出空间。如果没有设置这些属性,那么浏览器就无法预先确定视频的尺寸,这样就无法为视频保留合适的空间。结果是,在页面加载的过程中,其布局也会产生变化。

再比如下面这个例子:

<video src="../video/2.ogg" height="480" width="640" autoplay loop muted controls><p>你的浏览器不支持video标签</p>
</video>

这个例子中又增加了三个属性:
autoplay 属性可以让视频在准备完毕后自动播放;
loop 属性规定视屏循环播放,即播放完毕后再次从头开始播放; muted 属性让视频播放时默认是静音状态

接下来再看一个例子:

<video src="../video/2.ogg" height="480" width="640" preloader="auto" poster="../video/show.png" controls><p>你的浏览器不支持video标签</p>
</video>

这里出现两个属性: preloader 告诉了视频在页面加载时进行加载,并预备播放。如果使用 "autoplay",则忽略该属性。 preloader 有三个属性值可设置:

  • "none" 不缓冲文件
  • "auto" 缓冲音频文件
  • "metadata" 仅仅缓冲文件的元数据 poster 则设定了视频的展示图像,包括播放前的展示图像和下载的展示图像;如果未设定此属性,一般情况下播放前视频区是黑色的。

上面三个例子包含了html5 <video> 标签到目前新增的所有属性,整理如下:

  • height 播放器高度
  • width 播放器宽度
  • autoplay 视频准备完毕后自动播放
  • controls 显示包含“播放”、“进度条”、“全屏”等操作组件的播放控件
  • loop 设定视频循环播放
  • muted 静音播放视频
  • preload 视频在页面加载时进行加载,并预备播放。如果使用 "autoplay",则忽略该属性。
  • poster 视频展示的图像,即视频播放前或下载时展示的图像

<source> 标签

可以在 <video> 标签内使用 <source> 标签来指定多个播放文件,来为不同的浏览器提供可支持的编码格式。例如:

<video controls><source src="../video/2.ogg" type="video/ogg"><source src="../video/2.mp4" type="video/mp4"><p>你的浏览器不支持video标签</p>
</video>

浏览器会先加载 2.ogg, 如果不支持ogg格式或视频不存在,则会加载2.MP4,以此类推。

<source> 标签里,需要通过 src 来指定文件,通过 type 属性来指定文件格式。

<track> 标签

想要指定字幕文件,可以使用 <track> 标签;track 使用方式与 source 相同。

<video controls><source src="../video/2.ogg" type="video/ogg"><source src="../video/2.mp4" type="video/mp4"><track kind="captions" src="sampleCaptions.vtt" srclang="en"><track kind="descriptions" src="sampleDescriptions.vtt" srclang="en"><track kind="chapters" src="sampleChapters.vtt" srclang="en"><p>你的浏览器不支持video标签</p>
</video>

<track> 标签可以用于规定字幕文件或其他包含文本的文件。

<track> 标签属性包括:

  • src 源文件
  • kind 指定文件的使用目的,默认值为 subtitles ,可选值包括:
    • subtitles 定义此文件是字幕文件,就是大家熟悉的视频底部字幕了
    • captions 将在播放器中显示的简短说明
    • descriptions 视频内容的文本描述,适用于盲人或者视频不可见时的提供的音频描述。
    • chapters 定义章节,用于导航媒介资源
    • metadata 提供给脚本使用的内容,对用户不可见
  • label 为字幕文件指定一个名字,以供浏览器使用;当浏览器需要列出可用的字幕文件时,会使用此名字。
  • srclang 轨道的语言,若、当 kind 属性值为 "subtitles"时,该属性是必需的

虽然 <track> 标签为 video 提供了丰富的文本内容支持,但是目前浏览器对于 track 的支持率很不乐观。

以上简单介绍了HTML5中video标签的使用方法。下一篇文章计划介绍video事件相关内容。想要进行更深入的了解可以在此查看文档。

使用html5进行视频播放 (二)
在播放视频时,经常需要对播放进行控制。这时我们就需要使用 HTML5 <video> 元素的方法、属性和事件。

暂停/播放

video 的 play()、pause() 方法分别用于实现视频的播放、暂停。

通过对 video 标签的 paused 属性进行判断,可以知道当前视频的播放状态。视频处于播放状态时,paused 为 false;处于暂停状态时, paused 为 true。

示例:

<video id="video" preloader poster="../video/show.png" height="480" width="640"><source src="../video/trailer.MP4" type="video/mp4">
</video>
<button id="play_btn" type="button"></button>
var v = document.getElementById('video');var playBtn = document.getElementById('play_btn');playBtn.textContent = '>';playBtn.addEventListener("click", function(){if(v.paused){v.play();playBtn.textContent = '||';}else{v.pause();playBtn.textContent = '>';}
});

音量

通过 volume 属性可以控制播放音量。
volume 的值在 0~1 之间。

<video id="video" preloader poster="../video/show.png" height="480" width="640"><source src="../video/trailer.MP4" type="video/mp4">
</video>
<div>音量<button id="vol_inc_btn" type="button">+</button><button id="vol_dec_btn" type="button">-</button>
</div>
var v = document.getElementById('video');var volIncBtn = document.getElementById('vol_inc_btn');
var volDecBtn = document.getElementById('vol_dec_btn');volIncBtn.addEventListener("click", function(){v.volume > 0.9?v.volume = 1:v.volume += 0.1;
})volDecBtn.addEventListener("click", function(){v.volume < 0.1?v.volume = 0:v.volume -= 0.1;
})

muted 属性表示是否静音。值为 true 时,视频被静音。

<button id="muted_btn" type="button">静音</button>
var mutedBtn = document.getElementById('muted_btn');mutedBtn.addEventListener("click", function(){v.muted = !v.muted;mutedBtn.textContent = v.muted?'恢复':'静音';})

播放时间

video 的 currentTime 属性用来获取当前播放的位置。duration 属性表示当前资源的长度。利用这两个属性,可以实现 当前时刻/总长度 格式的时间显示。

<font id="now_time" size="3"></font>/<font id="duration" size="3"></font>
var nowTime = document.getElementById('now_time');
var duration = document.getElementById('duration');//初始值设为0
nowTime.textContent = 0;
duration.textContent = 0;//currentTime 和 duration 单位都是秒,我们写一个函数来将时间显示格式变为 mm:ss。
function parseTime(time){time = Math.floor(time);var _m, _s;_m = Math.floor(time/60);_s = time - _m*60;if(_m<10){_m = '0' + _m;}if(_s<10){_s = '0' + _s;}return _m + ':' + _s
}v.addEventListener('timeupdate', function(){nowTime.textContent = parseTime(v.currentTime);
})v.addEventListener('loadedmetadata', function(){console.log('loadedmetadata')duration.textContent = parseTime(v.duration);
})

这里用到了两个事件:timeupdate 和 loadedmetadata。

timeupdate 事件在播放时间改变时触发,在这里我们监听播放时间的改变,然后同步更新显示。

loadedmetada 在成功获取资源长度时触发。

进度条

在播放器中进度条是标配,我们在这里也简单实现以下进度条功能。

<div id="progressWrap"><div id="playProgress"></div>
</div>
var progressWrap = document.getElementById("progressWrap");
var playProgress = document.getElementById("playProgress");//计算当前进度条显示长度,利用前面说过的 currentTime 和 duration。
function getProgress(){var percent = v.currentTime / v.duration;playProgress.style.width = percent * (progressWrap.offsetWidth) + "px";
}// 鼠标在播放条上点击时进行捕获并进行处理
function videoSeek(e){if(v.paused || v.ended){v.play();}enhanceVideoSeek(e);
}
function enhanceVideoSeek(e){var length = e.pageX - progressWrap.offsetLeft;var percent = length / progressWrap.offsetWidth;playProgress.style.width = percent * (progressWrap.offsetWidth) + "px";v.currentTime = percent * v.duration;
}progressWrap.addEventListener('click', function(e){videoSeek(e);
})v.addEventListener('timeupdate', function(){getProgress();
})

播放速度

playbackRate 属性代表当前的播放速度。正常播放速度为 1。 通过改变 playbackRate 的值,可以调整视频的播放速度。

例如我们实现一个快进功能,使播放速度在 正常/2倍/4倍 间切换:

<button id="speed_up" type="button">快进</button>
var speedUpBtn = document.getElementById('speed_up');var _speed = 1;speedUpBtn.addEventListener('click', function(){changeSpeed();
});function changeSpeed () {_speed = _speed * 2;if(_speed>4){_speed = 1;}v.playbackRate = _speed;speedUpBtn.textContent = _speed===1?'快进':'快进x' + _speed;
}

有了快进功能,一般还要有一个快退的功能。在这里可以用之前提到过得 currentTime 来简单实现。

<button id="back" type="button">快退</button>
var backBtn = document.getElementById('back');
var _back_speed = 1;
var _t;backBtn.addEventListener('click', function(){_back_speed = _back_speed * 2;if(_back_speed>4){v.playbackRate = 1;_back_speed = 1;clearInterval(_t);}else{v.playbackRate = 0;clearInterval(_t);//通过计时器来不断改变当前播放位置,实现后退的功能_t = setInterval(function(){v.currentTime -= _back_speed * 0.1;},100)}backBtn.textContent = _back_speed===1?'快退':'快退x' + _back_speed;
})

加载状态

通过事件 loadstart 和 loadeddata 可以监控资源的加载状态。

当资源开始加载时,触发 loadstart 事件。加载完毕时,触发 loadeddata 事件。如果加载失败,触发 error 事件。

<p id="load_state"></p>
var loadState = document.getElementById('load_state');v.addEventListener('loadstart', function(){loadState.textContent = '视频加载中。。。';
})v.addEventListener('loadeddata', function(){loadState.textContent = '加载完毕。';
})v.addEventListener('error', function(){loadState.textContent = '加载失败。';
})

全屏

现在主流浏览器基本上实现了全屏效果,但是不同浏览器实现不一样:

// Webkit (works in Safari5.1 and Chrome 15)
element.webkitRequestFullScreen();
document.webkitCancelFullScreen();

// Firefox 10+
element.mozRequestFullScreen();
document.mozCancelFullScreen();

// W3C 提议
element.requestFullscreen();
document.exitFullscreen();

实现全屏效果,只需要调用这些方法即可。

<button id="fullscreen" type="button">全屏</button>
function requestFullScreen(de) {if (de.requestFullscreen) {de.requestFullscreen();} else if (de.mozRequestFullScreen) {de.mozRequestFullScreen();} else if (de.webkitRequestFullScreen) {de.webkitRequestFullScreen();}
}var fullscreen = document.getElementById('fullscreen');fullscreen.addEventListener('click', function(){requestFullScreen(v);
})

至此基本上实现了一个简单的播放器的操控组件,包括 播放、暂停、时间显示、音量调节、进度条、快进、快退、全屏等。我们的播放器张这样:


哈哈,很粗糙,但是加上样式的话会好很多吧~

除此之外, video 还提供了很多事件在上面的例子中并没有用到,就列举在下面,需要丰富功能时可以随时查看~

完整代码ChinTeo/html5videoDemo

转载于:https://www.cnblogs.com/sunbeidan/p/7676644.html

相关文章:

Linux学习之系统时间同步

一、系统时间的设置 在Linux中设置系统时间&#xff0c;可以用date命令&#xff1a; 1 //查看时间 2 [rootlocalhost ~]# date 3 2008年 12月 12日 星期五 14:44:12 CST 4 //修改时间 5 [rootlocalhost ~]# date --set "1/1/09 00:01" < &#xff08;月/日/年时:分…

uniapp(一) 项目架构,封装

前言&#xff1a; 最近需要搭建一套基于uniapp 的代码模板&#xff0c;适应各平台的快速打包部署&#xff0c;为提高代码复用率&#xff0c;提升生产力&#xff0c;所以需要构建一套优雅的前端项目架构&#xff0c;下面分享记录一下我的封装。 代码封装我暂时分为三个层面&…

linux下安装sbt_如何在Linux上安装SBT

linux下安装sbt介绍 (Introduction) Hi! I am Sanjula, and in this guide I hope to teach you how to install sbt on Linux.嗨&#xff01; 我是Sanjula &#xff0c;我希望在本指南中教您如何在Linux上安装sbt。 Let’s get started!让我们开始吧&#xff01; 什么是sbt&…

switch...case结构

/**switch(要判断的数据){ case 值1: ...;break; case 值2: ...;break; case 值3: ...;break; default: ...;break;}*/ publuc class employee{ int id; // 员工id String name; // 员工名字 int age; // 员工年龄 String phone; // 员工号码 String address; // 员工地址 publ…

自动布局的 弊端 (后续)

自动布局 比 直接写 frame 会慢很多 具体以后再说吧转载于:https://www.cnblogs.com/Ionatan/p/5109211.html

uniapp H5 JSSDK封装使用

先看效果吧, 封装以后使用很方便,两行代码就能得到微信网页开发中的 jssdk 的 wx.config 执行了 wx.ready 还是 wx.error ,如果返回 true 就标识执行了ready , 可以调用JSSDK的 API 了,如下图示例代码: this.$common.Init.call(this); this.wxjssdkInti().then(rr =>…

课程表美化 css_通过这门11小时的免费课程学习HTML和CSS

课程表美化 cssHTML and CSS are essential skills to have for a career in web development. This eleven hour course from John Smilga of Coding Addict will teach HTML and CSS from the scratch. By the end of this course you will be creating your own projects.HT…

JavaScript创建对象的两种方法和遍历对象的属性

创建新对象有两种不同的方法&#xff1a; 定义并创建对象的实例使用函数来定义对象&#xff0c;然后创建新的对象实例1.定义并创建对象的实例 var personnew Object(); person.firstname"John"; person.lastname"Doe"; person.age50; person.eyecolor"…

微信公众号H5订阅消息开发 uniapp订阅消息

简单说一下流程&#xff1a; 在页面带参数跳转到 https://mp.weixin.qq.com/mp/subscribemsg &#xff0c;然后用户授权确认或者取消以后&#xff0c;会返回参数里面 redirect_url 的地址&#xff0c;并且带上openid 等相应参数&#xff0c;在前端的页面判断链接里面携带了相关…

GRUB密码设置

通过编辑GRUB启动参数可以轻松的进入单用户模式从而修改root密码&#xff0c;GRUB的密码设置可分为全局密码和菜单密码。 一&#xff0c;全局密码设置 在splashimage这个参数的下一行可以加上password密码&#xff0c;保存后重新启动计算机&#xff0c;再次登录到GRUB菜单页…

国内使用dropbox_通过创建费用管理器来学习使用Dropbox API

国内使用dropboxLearn how to build an expense organizer with the Dropbox API and JavaScript ES6! 了解如何使用Dropbox API和JavaScript ES6构建费用管理器&#xff01; Dropbox is a content and collaboration platform. Its API allows you to add Dropbox features t…

【洛谷 1345】 奶牛的电信

以前刷试炼场时根本不会的 现在 一眼最小割&#xff01; #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #define MAXN 1000000 #define INF 100000000 using namespace std; int n,m,s,t; int tot2,g[MAXN],num[MAX…

uniapp兼容H5和小程序订阅消息授权开发封装,使用方便

本文使用 uniapp 框架开发&#xff0c;因为H5的订阅消息和小程序的订阅消息的授权流程不一样&#xff0c;但是很多地方需要使用授权&#xff0c;所以我封装了一个兼容H5和小程序订阅消息授权的方法&#xff0c;使用比较方便&#xff0c;希望能够帮助到你&#xff0c;实测可用。…

dma工作时cpu工不工作_CPU如何工作?

dma工作时cpu工不工作CPU, also known as the microprocessor is the heart and/or brain of a computer. Lets Deep dive into the core of the computer to help us write computer programs efficiently.CPU&#xff0c;也称为微处理器&#xff0c;是计算机的心脏和/或大脑。…

pymsql学习笔记

pymsql学习笔记 1. 执行SQL #!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql# 创建连接 conn pymysql.connect(host127.0.0.1, port3306, userroot, passwd123, dbt1) # 创建游标 cursor conn.cursor()# 执行update&#xff0c;并返回收影响行数, print(effect…

UITextView高度根据内容变化

1. 添加内容变化的通知响应事件&#xff1a;[[NSNotificationCenter defaultCenter] addObserver:self selector:selector(textChanged:) name: UITextViewTextDidChangeNotification object:nil]; 2 实现方法 - (void)textChanged:(NSNotification *)notification{ …

一:搭建一套免费的serverless网站

因为公司需求&#xff0c;需要快速搭建一个公司内部能够访问的资源查看管理的 PC网站&#xff0c;因为没有服务器&#xff0c;没有后端开发&#xff0c;又要快速上线使用&#xff0c;那么 serverless 就成了我的首选方案&#xff0c;下面从零开始搭建。 步骤一. 准备工作 1. …

monorepo_Monorepo开发的要点

monorepoThe word monorepo is a combination between “mono”, as in the Greek word mnos (in translation, alone) and an abbreviation of the word repository. A simple concept if taken verbatim: one lonely repository. The domain is software engineering so we’…

记一次 HTTP信息头管理器使用 的重要性

今天在测试中遇到了一个问题 使用JMeter时请求相关地址参数及方法都填写正确&#xff0c;但是相应数据返回始终不对&#xff0c;例如 查看取样器结果显示 200 正常&#xff0c;但响应数据不符合正常的结果。 经反复检查发现问题如下&#xff1a; 1&#xff09;没有添加HTTP信息…

手把手,教你怎样用命令行给apk签名

最近因为项目上线&#xff0c;要配合运营的童鞋们上传各渠道apk,其中&#xff0c;搜狗的渠道因为迁移问题&#xff0c;需要给一个他们提供的空的apk签名&#xff0c;然后用公司的签名文件进行签名 没办法&#xff0c;只能手动给apk签名&#xff0c;网上搜索一片均不太完善&…

uniapp富文本复制文字内容

设置样式即可 text,span,p {user-select: text;-webkit-user-select: text;}

创建react应用程序_通过创建食谱应用程序来学习在React中使用API

创建react应用程序Learn how to use external APIs with React and React Router in a full tutorial from Hamza Mirza. This tutorial shows how to create a recipe finder application in React.在Hamza Mirza的完整教程中&#xff0c;了解如何将外部API与React和React Rou…

dogse入门指南

dogse入门指南 Dogse作为游戏服务端引擎&#xff0c;目前只包含游戏服务端的核心部分&#xff0c;但这也是最核心的部分。它全部使用.net c#开发&#xff0c;充分兼顾了程序性能与代码编写的准确性与易用性&#xff0c;再加上以vs作为开发工具&#xff0c;极大的提升代码的编写…

Python maketrans() 方法

描述 Python maketrans() 方法用于给 translate() 方法创建字符映射转换表。 可以只接受一个参数&#xff0c;此时这个参数是个字典类型&#xff08;暂不研究这种情况&#xff09;。 对于接受两个参数的最简单的调用方式&#xff0c;第一个参数是字符串&#xff0c;表示需要转换…

二:serverless网站数据库操作

操作数据库API文档 第一篇&#xff0c;搭建一套免费的serverless网站 一&#xff0c;创建集合&#xff0c;进入控制台 登录腾讯云后台 打开云开发控制台 可以新建集合&#xff0c;新建集合后点击集合名称即可批量导入导出数据库集合的数据&#xff0c;还可以设置数据库访问的…

我希望支持JavaScript GraphQL实现的API

The GraphQL schema language is great! It is certainly the best way to communicate anything about a GraphQL service. No wonder all documentations now use it!GraphQL 模式语言很棒&#xff01; 当然&#xff0c;这是传达与GraphQL服务有关的任何东西的最佳方法。 难怪…

2_Selenium对象识别

1 准备工作 firebug和firepath我们使用xpath进行元素定位&#xff0c;所以需要安装firefox的两个插件&#xff0c;帮助编写xpath html知识在编写xpath的时候&#xff0c;需要查看html代码&#xff0c;所以需要理解html知识&#xff0c;可以到http://www.w3school.com.cn/去自学…

Mac OS Terminal Commands

转自 &#xff1a; http://www.renfei.org/blog/mac-os-x-terminal-101.html Mac OS X Terminal 101&#xff1a;终端使用初级教程 July 29, 2012 / 编程指南最近学习苹果认证的《Mac OS X Support Essentials》教程&#xff0c;看到 Command Line 一节有很多实用的知识&#x…

封装一个计时器,记录页面的停留时间

在页面加载时初始化计时器&#xff0c;页面结束时取值。 效果如图&#xff1a; 下面是uniapp的代码示例&#xff1a; <template><view class"aaaacc"><view class"aaa">{{time}}</view></view> </template><scri…

ess用户名和密码_陈ess洁如何从摄影系学生转变为成功的自由职业者和内容创作者(播客)...

ess用户名和密码This week, for our last podcast episode of 2019, I got to chat with freelancer and content creator Jessica Chan - known as CoderCoder on social media - about how she got into tech and started her educational website and YouTube channel.本周&…