audio 在浏览器中自动播放

autoplay 属性

autoplay 属性规定一旦音频就绪马上开始播放。
如果设置了该属性,音频将自动播放。

使用 autoplay 属性进行播放

    //使用autoplay属性var src = "./award.wav";var body = document.getElementsByTagName("body")[0];if (body.getElementsByTagName("audio").length <= 0) {var audio = document.createElement("audio");audio.setAttribute("id", "awardAudio");audio.setAttribute("autoplay", "autoplay");audio.setAttribute("src", src);body.appendChild(audio);setTimeout(function() {body.removeChild(audio);}, 2300);}

oncanplaythrough 事件

oncanplaythrough 事件在视频/音频(audio/video)可以正常播放且无需停顿和缓冲时触发。
在视频/音频(audio/video)加载过程中,事件的触发顺序如下:

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

监听 canplaythrough 事件进行播放

    // 监听加载事件执行play方法var src = "./award.wav";var body = document.getElementsByTagName("body")[0];if (body.getElementsByTagName("audio").length <= 0) {var audio = document.createElement("audio");audio.setAttribute("id", "awardAudio");audio.setAttribute("src", src);body.appendChild(audio);//判断音频是否加载完成?audio.addEventListener("canplaythrough",function() {audio.play();setTimeout(function() {body.removeChild(audio);}, audio.duration * 1000 + 100);},false);}

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中做成组件

/*** Created by easterCat on 2017/10/13.*/import React from 'react';
import ReactDOM from 'react-dom';
import {connect} from 'react-redux';
import {Icon} from 'antd';class RecordAudio extends React.Component {constructor(props) {super(props);this.state = {isPlay: false,openMuted: false,volume: 100,allTime: 0,currentTime: 0};this.millisecondToDate = (time) => {const second = Math.floor(time % 60);let minite = Math.floor(time / 60);return `${minite}:${second >= 10 ? second : `0${second}`}`};this.controlAudio = (type, e) => {const audio = ReactDOM.findDOMNode(this.refs['audio']);switch (type) {case 'allTime':this.setState({allTime: audio.duration});break;case 'play':audio.play();this.setState({isPlay: true});break;case 'pause':audio.pause();this.setState({isPlay: false});break;case 'changeCurrentTime':this.setState({currentTime: e.target.value});audio.currentTime = e.target.value;if (e.target.value === audio.duration) {this.setState({isPlay: false})}break;case 'getCurrentTime':this.setState({currentTime: audio.currentTime});if (audio.currentTime === audio.duration) {this.setState({isPlay: false})}break;//    是否静音case 'muted':audio.muted = !audio.muted;//为true,则是静音模式if (audio.muted) {this.setState({openMuted: true,volume: 0});} else {this.setState({openMuted: false,volume: 100});}break;//    调节音量case 'changeVolume':/*** muted=true开启静音模式,muted=false开启声音* @type {number}*/audio.volume = e.target.value / 100;this.setState({volume: e.target.value,});//如果声音为0,开起静音if (e.target.value <= 0) {audio.muted = true;this.setState({openMuted: true})} else if (e.target.value >= 0) {audio.muted = false;this.setState({openMuted: false})}break}}}componentDidMount() {}render() {const {src} = this.props;return (<div className="audioBox"><audio ref="audio"src={src}preload={true}onCanPlay={() => this.controlAudio('allTime')}onTimeUpdate={(e) => this.controlAudio('getCurrentTime')}>音乐播放器</audio><i className={this.state.isPlay ? 'pause' : 'play'}onClick={() => this.controlAudio(this.state.isPlay ? 'pause' : 'play')}>{this.state.isPlay ? <Icon className="pause-btn" type="pause"/> :<Icon className="play-btn" type="caret-right"/>}</i><span className="current">{this.millisecondToDate(this.state.currentTime) + '/' + this.millisecondToDate(this.state.allTime)}</span><input type="range"className="time"min="0"step="0.01"max={this.state.allTime}value={this.state.currentTime}onChange={(e) => this.controlAudio('changeCurrentTime', e)}/><i className={this.state.openMuted ? 'mute' : 'nomute'}onClick={() => this.controlAudio('muted')}>{this.state.openMuted ? <Icon className="nomute-btn" type="check"/> :<Icon className="mute-btn" type="close"/>}</i><input type="range"className="volume"min="0"step="1"max="100"onChange={(e) => this.controlAudio('changeVolume', e)}value={this.state.openMuted ? 0 : this.state.volume}/></div>)}
}const mapStateToProps = (state) => {return {}
};const mapActionCreators = {};export default connect(mapStateToProps, mapActionCreators)(RecordAudio);

HTML 5 视频/音频参考手册
HTML5 声音引擎 Howler.js
MDN audio
基于 react 的 audio 组件
HTML5 Audio 的兼容性问题和优化
html5 audio 音频播放全解析
音频 API => AudioContext

转载于:https://www.cnblogs.com/mybilibili/p/10376528.html

[JavaScript] audio在浏览器中自动播放相关推荐

  1. H5页面在微信浏览器中自动播放视频

    H5页面在微信浏览器中自动播放视频 安卓和IOS不同 h5在安卓微信浏览器上的视频不能自动播放 h5在iOS微信浏览器上的视频可以自动播放 iOS的实现方案

  2. JavaScript + Audio API自制简易音乐播放器(详细完整版、小白都能看懂)

    JavaScript + Audio API自制简易音乐播放器(详细完整版) ** 音乐播放器的功能清单如下: ** 1.点击暂停按钮,歌曲暂停 2.点击播放按钮,歌曲播放 3.单曲循环与取消单曲循环 ...

  3. 解决google浏览器无法自动播放音视频问题

    浏览器报错:Unmuting failed and the element was paused instead because the user didn't interact with the d ...

  4. 【转】禁用Chrome和Firefox中自动播放的动画GIF

    动画GIF已经腐臭,并且在浏览时自动播放时可能会非常烦人.以下是如何阻止他们在Chrome和Firefox中自动播放. 禁用动画GIF Firefox 在地址栏中输入:  about:config,然 ...

  5. Python+BeautifulSoup+Selenium模拟浏览器循环自动播放视频,如哔哩哔哩某个UP主的视频

    1.前言 计算机的出现,推动了人类社会的进步,使得人们更高效的工作或是生活.当我们很"懒"的时候,计算机就能站出来,帮助我们做一些我们觉得浪费时间的事情了.你嫌用手点鼠标麻烦,计算 ...

  6. 微信浏览器背景音乐自动播放

    html: <audio style="display:none; height: 0" id="bg-music" preload="auto ...

  7. python实现自动点击器_Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)...

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

  8. 怎么让优酷视频在网页中自动播放方法

    优酷视频在网页中自动播放: 方法一 1.首先在优酷复制得到欲贴视频的代码, <embed src="http://player.youku.com/player.php/sid/XMz ...

  9. 用java获取360doc页面上的url地址并在浏览器中自动打开

    一.前言 最近在看一些前端的文章360doc,每次选中需要的url,都会弹出一个提示框,然后关闭后又自动转发到另一个页面,让人觉的很烦,于是便有了下面这个想法的产生. 二.java实现获取指定页面ur ...

最新文章

  1. 利用phpmailer类邮件发送
  2. 撕掉伪善——用人话解释马云的996两次发言
  3. php变量赋值给js
  4. 怎么退出自适应巡航_沃尔-ACC 自适应巡航控制系统
  5. spring源码读书笔记(1)
  6. html5 hgroup,HTML5 hgroup 标签
  7. nagios check_mysql uptime_nagios使用check_mysql监控mysql
  8. OpenCV中基本数据结构(6)_Matx
  9. R语言使用merge函数合并数据,如何保持原始数据顺序
  10. 目前常用的开源服务器端技术
  11. Ubuntu 16.04 LTS安装Docker并使用加速器
  12. 基于C++实现校园卡管理系统
  13. 17年前那场疫情:马云隔离在家,刘强东关了12家店,俞敏洪欠债700万......
  14. 常用的公共 DNS 服务器 IP 地址
  15. mysql where查询字段是json,mysql json查询某字段包含a和b:
  16. 7.arm汇编 bic和orr指令
  17. vue项目中样式重置 自动注入less
  18. 中国ROHS 2.0 ---sj/t 11364-2014
  19. 新赛季的中超和国安,荆棘中前行
  20. tensorflow 如何计算向量余弦相似 cosine similarity

热门文章

  1. 如何在Android设备上识别读取美国驾照信息
  2. 联想笔记本win10系统加装SSD固态硬盘,系统迁移流程
  3. 解决Mac电脑连不上wifi的问题
  4. 虚幻4--UE4是什么?
  5. 计算机如何调成音乐,如何调出适用于我的均衡器设置?
  6. html网页配色,#0000ff表示什么颜色,设计师谈网页配色:按颜色分类(黄色)
  7. 第06章 Tableau仪表板和故事
  8. 求生之路服务器列表只显示ip,L4DL4D2 玩家进入退出+玩家转队伍SteamIdIP+国家+城市显示SQL版本 SP源码 2.4(2013-10-15更新)...
  9. Unity的lookRotation和lookAt的区别理解,是什么意思。
  10. JAVA医院预约挂号系统毕业设计 开题报告