audio 在浏览器中自动播放

autoplay 属性

autoplay 属性规定一旦音频就绪马上开始播放。

如果设置了该属性,音频将自动播放。

使用 autoplay 属性进行播放

  1. //使用autoplay属性
  2. var src = "./award.wav";
  3. var body = document.getElementsByTagName("body")[0];
  4. if (body.getElementsByTagName("audio").length <= 0) {
  5. var audio = document.createElement("audio");
  6. audio.setAttribute("id", "awardAudio");
  7. audio.setAttribute("autoplay", "autoplay");
  8. audio.setAttribute("src", src);
  9. body.appendChild(audio);
  10. setTimeout(function() {
  11. body.removeChild(audio);
  12. }, 2300);
  13. }

oncanplaythrough 事件

oncanplaythrough 事件在视频/音频(audio/video)可以正常播放且无需停顿和缓冲时触发。

在视频/音频(audio/video)加载过程中,事件的触发顺序如下:

  1. onloadstart
  2. ondurationchange
  3. onloadedmetadata
  4. onloadeddata
  5. onprogress
  6. oncanplay
  7. oncanplaythrough
  1. //1
  2. <audio oncanplaythrough="event">
  3. //2
  4. audio.oncanplaythrough=function(){event()};
  5. //3
  6. audio.addEventListener("canplaythrough", event;

监听 canplaythrough 事件进行播放

  1. // 监听加载事件执行play方法
  2. var src = "./award.wav";
  3. var body = document.getElementsByTagName("body")[0];
  4. if (body.getElementsByTagName("audio").length <= 0) {
  5. var audio = document.createElement("audio");
  6. audio.setAttribute("id", "awardAudio");
  7. audio.setAttribute("src", src);
  8. body.appendChild(audio);
  9. //判断音频是否加载完成?
  10. audio.addEventListener(
  11. "canplaythrough",
  12. function() {
  13. audio.play();
  14. setTimeout(function() {
  15. body.removeChild(audio);
  16. }, audio.duration * 1000 + 100);
  17. },
  18. false
  19. );
  20. }

duration 在 autoplay 下回失效,返回 NaN

JS 报错:Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.

https://goo.gl/xX8pDD这里是官方给出的解释,chrome66 之后反正是不能用了

解决方法

  1. 在 chrome 浏览器中输入 chrome://flags/#autoplay-policy
  2. 在 Autoplay policy 下拉中设置无需用户手势
  3. 重启 chrome

  1. chrome.exe --disable-features=AutoplayIgnoreWebAudio

MDN->audio

  • MDN->audio 属性

    • src 歌曲的路径
    • preload 是否在页面加载后立即加载(设置 autoplay 后无效)
    • controls 显示 audio 自带的播放控件
    • loop 音频循环
    • autoplay 音频加载后自动播放
    • currentTime 音频当前播放时间
    • duration 音频总长度
    • ended 音频是否结束
    • muted 音频静音为 true
    • volume 当前音频音量
    • readyState 音频当前的就绪状态
  • MDN->audio 事件
    • abort 当音频/视频的加载已放弃时
    • canplay 当浏览器可以播放音频/视频时
    • canplaythrough 当浏览器可在不因缓冲而停顿的情况下进行播放时
    • durationchange 当音频/视频的时长已更改时
    • emptied 当目前的播放列表为空时
    • ended 当目前的播放列表已结束时
    • error 当在音频/视频加载期间发生错误时
    • loadeddata 当浏览器已加载音频/视频的当前帧时
    • loadedmetadata 当浏览器已加载音频/视频的元数据时
    • loadstart 当浏览器开始查找音频/视频时
    • pause 当音频/视频已暂停时
    • play 当音频/视频已开始或不再暂停时
    • playing 当音频/视频在已因缓冲而暂停或停止后已就绪时
    • progress 当浏览器正在下载音频/视频时
    • ratechange 当音频/视频的播放速度已更改时
    • seeked 当用户已移动/跳跃到音频/视频中的新位置时
    • seeking 当用户开始移动/跳跃到音频/视频中的新位置时
    • stalled 当浏览器尝试获取媒体数据,但数据不可用时
    • suspend 当浏览器刻意不获取媒体数据时
    • timeupdate 当目前的播放位置已更改时
    • volumechange 当音量已更改时
    • waiting 当视频由于需要缓冲下一帧而停止

在react中做成组件

  1. /**
  2. * Created by easterCat on 2017/10/13.
  3. */
  4. import React from 'react';
  5. import ReactDOM from 'react-dom';
  6. import {connect} from 'react-redux';
  7. import {Icon} from 'antd';
  8. class RecordAudio extends React.Component {
  9. constructor(props) {
  10. super(props);
  11. this.state = {
  12. isPlay: false,
  13. openMuted: false,
  14. volume: 100,
  15. allTime: 0,
  16. currentTime: 0
  17. };
  18. this.millisecondToDate = (time) => {
  19. const second = Math.floor(time % 60);
  20. let minite = Math.floor(time / 60);
  21. return `${minite}:${second >= 10 ? second : `0${second}`}`
  22. };
  23. this.controlAudio = (type, e) => {
  24. const audio = ReactDOM.findDOMNode(this.refs['audio']);
  25. switch (type) {
  26. case 'allTime':
  27. this.setState({
  28. allTime: audio.duration
  29. });
  30. break;
  31. case 'play':
  32. audio.play();
  33. this.setState({
  34. isPlay: true
  35. });
  36. break;
  37. case 'pause':
  38. audio.pause();
  39. this.setState({
  40. isPlay: false
  41. });
  42. break;
  43. case 'changeCurrentTime':
  44. this.setState({
  45. currentTime: e.target.value
  46. });
  47. audio.currentTime = e.target.value;
  48. if (e.target.value === audio.duration) {
  49. this.setState({
  50. isPlay: false
  51. })
  52. }
  53. break;
  54. case 'getCurrentTime':
  55. this.setState({
  56. currentTime: audio.currentTime
  57. });
  58. if (audio.currentTime === audio.duration) {
  59. this.setState({
  60. isPlay: false
  61. })
  62. }
  63. break;
  64. // 是否静音
  65. case 'muted':
  66. audio.muted = !audio.muted;
  67. //为true,则是静音模式
  68. if (audio.muted) {
  69. this.setState({
  70. openMuted: true,
  71. volume: 0
  72. });
  73. } else {
  74. this.setState({
  75. openMuted: false,
  76. volume: 100
  77. });
  78. }
  79. break;
  80. // 调节音量
  81. case 'changeVolume':
  82. /**
  83. * muted=true开启静音模式,muted=false开启声音
  84. * @type {number}
  85. */
  86. audio.volume = e.target.value / 100;
  87. this.setState({
  88. volume: e.target.value,
  89. });
  90. //如果声音为0,开起静音
  91. if (e.target.value <= 0) {
  92. audio.muted = true;
  93. this.setState({
  94. openMuted: true
  95. })
  96. } else if (e.target.value >= 0) {
  97. audio.muted = false;
  98. this.setState({
  99. openMuted: false
  100. })
  101. }
  102. break
  103. }
  104. }
  105. }
  106. componentDidMount() {
  107. }
  108. render() {
  109. const {src} = this.props;
  110. return (
  111. <div className="audioBox">
  112. <audio ref="audio"
  113. src={src}
  114. preload={true}
  115. onCanPlay={() => this.controlAudio('allTime')}
  116. onTimeUpdate={(e) => this.controlAudio('getCurrentTime')}
  117. >
  118. 音乐播放器
  119. </audio>
  120. <i className={this.state.isPlay ? 'pause' : 'play'}
  121. onClick={() => this.controlAudio(this.state.isPlay ? 'pause' : 'play')}
  122. >
  123. {
  124. this.state.isPlay ? <Icon className="pause-btn" type="pause"/> :
  125. <Icon className="play-btn" type="caret-right"/>
  126. }
  127. </i>
  128. <span className="current">
  129. {
  130. this.millisecondToDate(this.state.currentTime) + '/' + this.millisecondToDate(this.state.allTime)
  131. }
  132. </span>
  133. <input type="range"
  134. className="time"
  135. min="0"
  136. step="0.01"
  137. max={this.state.allTime}
  138. value={this.state.currentTime}
  139. onChange={(e) => this.controlAudio('changeCurrentTime', e)}
  140. />
  141. <i className={this.state.openMuted ? 'mute' : 'nomute'}
  142. onClick={() => this.controlAudio('muted')}
  143. >
  144. {
  145. this.state.openMuted ? <Icon className="nomute-btn" type="check"/> :
  146. <Icon className="mute-btn" type="close"/>
  147. }
  148. </i>
  149. <input type="range"
  150. className="volume"
  151. min="0"
  152. step="1"
  153. max="100"
  154. onChange={(e) => this.controlAudio('changeVolume', e)}
  155. value={this.state.openMuted ? 0 : this.state.volume}
  156. />
  157. </div>
  158. )
  159. }
  160. }
  161. const mapStateToProps = (state) => {
  162. return {}
  163. };
  164. const mapActionCreators = {};
  165. export default connect(mapStateToProps, mapActionCreators)(RecordAudio);

HTML 5 视频/音频参考手册

HTML5 声音引擎 Howler.js

MDN audio

基于 react 的 audio 组件

HTML5 Audio 的兼容性问题和优化

html5 audio 音频播放全解析

音频 API => AudioContext

[JavaScript] audio在浏览器中自动播放的更多相关文章

  1. 在iOS微信浏览器中自动播放HTML5 audio(音乐)的2种正确方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 解决H5微信浏览器中audio兼容-- 背景音乐无法自动播放

    我们知道,ios 在safari浏览器中,audio标签不能在没有用户交互的情况下自动播放或有js直接控制播放,这是系统限制的一些原因. 但是背景音乐在微信浏览器可以设置自动播放,config配置一下 ...

  3. 解决audio 在部分移动端浏览器不能自动播放(目前包括ios、微博)

    问题描述:项目需要在页面加载完成后自动播放音乐,但在ios中却无法自动播放,需要用户主动触发 解决办法: $('html').one('touchstart',function(){ document ...

  4. 解决Chrome浏览器无法自动播放音频视频的问题,Uncaught (in promise) DOMException

    转载自:http://www.nooong.com/docs/chrome_video_autoplay.htm 在最新版的Chrome浏览器(以及所有以Chromium为内核的浏览器)中,已不再允许 ...

  5. ios微信浏览器音乐自动播放

    setTimeout(function(){ //一般情况下,这样就可以自动播放了,但是一些奇葩iPhone机不可以 document.getElementById('bgmedia').play() ...

  6. 关于selenium无法在chrome中自动播放flash的问题

    最近用selenium写个小脚本,遇到flash不能自动播放问题 我遇到的情况,直接提示 请确认是否安装flash,其实已经安装,点击下载flash,然后提示是否允许. 整了好久,发现终极方法: ## ...

  7. 如何使用python来模拟鼠标点击(将通过实例自动化模拟在360浏览器中自动搜索"python")

    一.准备工作: 安装pywin32,后面开发需要pywin32的支持,否则无法完成与windows层面相关的操作. pywin32的具体安装及注意事项: 1.整体开发环境: 基于windows7操作系 ...

  8. JavaScript问题——在浏览器中每一个元素都有一个offsetParent属性,这个属性是什么?

    原文链接http://www.cnblogs.com/zcjnever/archive/2011/04/21/2023133.html Javascript中的offsetParent属性 支持的浏览 ...

  9. JavaScript问题——在浏览器中的offsetLeft/offsetWidth等属性是什么?

    原文链接http://www.cnblogs.com/xiaohuochai/p/5828369.html https://blog.csdn.net/u012532033/article/detai ...

随机推荐

  1. PeopleSoft 后台更新密码

    一.SQL脚本 where t.oprid='&opridName' ; 二.Data Mover 1.指定用户加密ENCRYPT_PASSWORD 用户名;2.所有用户ENCRYPT_PAS ...

  2. pywin32模块安装

    安装流程: 1.查看python版本和位数: 2.下载对应的的pywin32,下载目录任意 https://sourceforge.net/projects/pywin32/files%2Fpywin ...

  3. 学习如何设置ssh安全只允许用户从指定的IP登陆

    参考原文链接:https://www.cnblogs.com/wuling129/p/5076081.html 因为在公司做项目时,员工的登录可能受到外界人的窃取,为了防止被攻击,设置系统只能允许用户 ...

  4. 机器学习(六)K-means聚类、密度聚类、层次聚类、谱聚类

    本文主要简述聚类算法族.聚类算法与前面文章的算法不同,它们属于非监督学习. 1.K-means聚类 记k个簇中心,为\(\mu_{1}\),\(\mu_{2}\),...,\(\mu_{k}\),每个 ...

  5. Java for Android 第三周学习总结

    第五章 核心类 java.lang.Object中的方法: clone(创建并返回该对象的一个副本.实现这个方法的一个类,将支持对象的复制) equals(将该对象和传入的对象进行比较.必须实现这个算 ...

  6. django 源码报错

    启动django ,一直提示一个 AttributeError: 'str' object has no attribute 'decode' 哥,查了一下午google,就怕是自己判断错了,最后在一 ...

  7. 谨以此篇献给DJANGO学习过程中遇到的问题

    谨以此篇献给DJANGO学习过程中遇到的问题 一.Django数据同步过程中遇到的问题: 1.raise ImproperlyConfigured('mysqlclient 1.3.13 or new ...

  8. 购物车自己sql错误

    $user_id=$_GET['user_id']; if(!$user_id){ $arr=array('code'=>-1,'data'=>"用户不存在"); ec ...

  9. Servlet 监听器Listner

    定义:      专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动. Servlet 规范为每种事件监听器都定义了相应的接口,它用于监听 ...

  10. HTML图片标签路径解析

    img标签中src属性表示的是引用的图片路径,有两种路径类型: 1. 绝对路径    2. 相对路径. 绝对路径:使用图片在硬盘上的绝对位置来访问图片,通常是从根目录开始,向下一个目录一个目录的寻找. ...