安装
使用 npm:
- npm install dplayer --save
使用 Yarn:
- yarn add dplayer
快速开始
我们先尝试初始化一个最简单的 DPlayer
加载播放器文件:
- <link rel="stylesheet" href="DPlayer.min.css" />
- <div id="dplayer"></div>
- <script src="DPlayer.min.js"></script>
或者使用模块管理器:
- import 'dplayer/dist/DPlayer.min.css';
- import DPlayer from 'dplayer';
- const dp = new DPlayer(options);
在 js 里初始化:
- const dp = new DPlayer({
- container: document.getElementById('dplayer'),
- video: {
- url: 'demo.mp4',
- },
- });
一个最简单的 DPlayer 就初始化好了,它只有最基本的视频播放功能
参数
DPlayer 有丰富的参数可以自定义你的播放器实例


- const dp = new DPlayer({
- container: document.getElementById('dplayer'),
- autoplay: false,
- theme: '#FADFA3',
- loop: true,
- lang: 'zh-cn',
- screenshot: true,
- hotkey: true,
- preload: 'auto',
- logo: 'logo.png',
- volume: 0.7,
- mutex: true,
- video: {
- url: 'dplayer.mp4',
- pic: 'dplayer.png',
- thumbnails: 'thumbnails.jpg',
- type: 'auto',
- },
- subtitle: {
- url: 'dplayer.vtt',
- type: 'webvtt',
- fontSize: '25px',
- bottom: '10%',
- color: '#b7daff',
- },
- danmaku: {
- id: '9E2E3368B56CDBB4',
- api: 'https://api.prprpr.me/dplayer/',
- token: 'tokendemo',
- maximum: 1000,
- addition: ['https://api.prprpr.me/dplayer/v3/bilibili?aid=4157142'],
- user: 'DIYgod',
- bottom: '15%',
- unlimited: true,
- },
- contextmenu: [
- {
- text: 'custom1',
- link: 'https://github.com/DIYgod/DPlayer',
- },
- {
- text: 'custom2',
- click: (player) => {
- console.log(player);
- },
- },
- ],
- highlight: [
- {
- time: 20,
- text: '这是第 20 秒',
- },
- {
- time: 120,
- text: '这是 2 分钟',
- },
- ],
- });
API
- dp.play(): 播放视频
- dp.pause(): 暂停视频
- dp.seek(time: number): 跳转到特定时间
-
- dp.seek(100);
- dp.toggle(): 切换播放和暂停
- dp.on(event: string, handler: function): 绑定视频和播放器事件,见#事件绑定
- dp.switchVideo(video, danmaku): 切换到其他视频
-
- dp.switchVideo(
- {
- url: 'second.mp4',
- pic: 'second.png',
- thumbnails: 'second.jpg',
- },
- {
- id: 'test',
- api: 'https://api.prprpr.me/dplayer/',
- maximum: 3000,
- user: 'DIYgod',
- }
- );
- dp.notice(text: string, time: number): 显示通知,时间的单位为毫秒,默认时间 2000 毫秒,默认透明度 0.8
- dp.switchQuality(index: number): 切换清晰度
- dp.destroy(): 销毁播放器
- dp.speed(rate: number): 设置视频速度
- dp.volume(percentage: number, nostorage: boolean, nonotice: boolean): 设置视频音量
-
- dp.volume(0.1, true, false);
- dp.video: 原生 video
- dp.video.currentTime: 返回视频当前播放时间
- dp.video.duration: 返回视频总时间
- dp.video.paused: 返回视频是否暂停
- 支持大多数原生 video 接口
- dp.danmaku
- dp.danmaku.send(danmaku, callback: function): 提交一个新弹幕
-
- dp.danmaku.send(
- {
- text: 'dplayer is amazing',
- color: '#b7daff',
- type: 'right', // should be `top` `bottom` or `right`
- },
- function() {
- console.log('success');
- }
- );
- dp.danmaku.draw(danmaku): 实时绘制一个新弹幕
-
- dp.danmaku.draw({
- text: 'DIYgod is amazing',
- color: '#fff',
- type: 'top',
- });
- dp.danmaku.opacity(percentage: number): 设置弹幕透明度,透明度值在 0 到 1 之间
-
- dp.danmaku.opacity(0.5);
- dp.danmaku.clear(): 清除所有弹幕
- dp.danmaku.hide(): 隐藏弹幕
- dp.danmaku.show(): 显示弹幕
- dp.fullScreen: 两个类型:web 和 browser,默认类型是 browser
- dp.fullScreen.request(type: string): 进入全屏
-
- dp.fullScreen.request('web');
- dp.fullScreen.cancel(type: string): 退出全屏
-
- dp.fullScreen.cancel('web');
事件绑定
dp.on(event, handler)
- dp.on('ended', function() {
- console.log('player ended');
- });
视频事件
- abort
- canplay
- canplaythrough
- durationchange
- emptied
- ended
- error
- loadeddata
- loadedmetadata
- loadstart
- mozaudioavailable
- pause
- play
- playing
- progress
- ratechange
- seeked
- seeking
- stalled
- suspend
- timeupdate
- volumechange
- waiting
播放器事件
- screenshot
- thumbnails_show
- thumbnails_hide
- danmaku_show
- danmaku_hide
- danmaku_clear
- danmaku_loaded
- danmaku_send
- danmaku_opacity
- contextmenu_show
- contextmenu_hide
- notice_show
- notice_hide
- quality_start
- quality_end
- destroy
- resize
- fullscreen
- fullscreen_cancel
- subtitle_show
- subtitle_hide
- subtitle_change
清晰度切换
在 video.quality 里设置不同清晰度的视频链接和类型,video.defaultQuality 设置默认清晰度
Load demo
- const dp = new DPlayer({
- container: document.getElementById('dplayer'),
- video: {
- quality: [
- {
- name: 'HD',
- url: 'demo.m3u8',
- type: 'hls',
- },
- {
- name: 'SD',
- url: 'demo.mp4',
- type: 'normal',
- },
- ],
- defaultQuality: 0,
- pic: 'demo.png',
- thumbnails: 'thumbnails.jpg',
- },
- });
弹幕
#弹幕接口
danmaku.api
现成的接口
链接: https://api.prprpr.me/dplayer/
每日备份: DPlayer-data
自己搭建
#bilibili 弹幕
danmaku.addition
- const option = {
- danmaku: {
- // ...
- addition: ['https://api.prprpr.me/dplayer/v3/bilibili?aid=[aid]'],
- },
- };
MSE 支持
#HLS
需要在 DPlayer.min.js 前面加载 hls.js。
Load demo
- <link rel="stylesheet" href="DPlayer.min.css" />
- <div id="dplayer"></div>
- <script src="hls.min.js"></script>
- <script src="DPlayer.min.js"></script>
const dp = new DPlayer({- container: document.getElementById('dplayer'),
- video: {
- url: 'demo.m3u8',
- type: 'hls',
- },
- pluginOptions: {
- hls: {
- // hls config
- },
- },
- });
- console.log(dp.plugins.hls); // Hls 实例
// 另一种方式,使用 customType- const dp = new DPlayer({
- container: document.getElementById('dplayer'),
- video: {
- url: 'demo.m3u8',
- type: 'customHls',
- customType: {
- customHls: function(video, player) {
- const hls = new Hls();
- hls.loadSource(video.src);
- hls.attachMedia(video);
- },
- },
- },
- });
#MPEG DASH
需要在 DPlayer.min.js 前面加载 dash.js。
- <link rel="stylesheet" href="DPlayer.min.css" />
- <div id="dplayer"></div>
- <script src="dash.min.js"></script>
- <script src="DPlayer.min.js"></script>
const dp = new DPlayer({- container: document.getElementById('dplayer'),
- video: {
- url: 'demo.mpd',
- type: 'dash',
- },
- pluginOptions: {
- dash: {
- // dash config
- },
- },
- });
- console.log(dp.plugins.dash); // Dash 实例
// 另一种方式,使用 customType- const dp = new DPlayer({
- container: document.getElementById('dplayer'),
- video: {
- url: 'demo.mpd',
- type: 'customDash',
- customType: {
- customDash: function(video, player) {
- dashjs
- .MediaPlayer()
- .create()
- .initialize(video, video.src, false);
- },
- },
- },
- });
#MPEG DASH (Shaka)
需要在 DPlayer.min.js 前面加载 shaka-player.compiled.js。
- <link rel="stylesheet" href="DPlayer.min.css" />
- <div id="dplayer"></div>
- <script src="shaka-player.compiled.js"></script>
- <script src="DPlayer.min.js"></script>
const dp = new DPlayer({- container: document.getElementById('dplayer'),
- screenshot: true,
- video: {
- url: 'demo.mpd',
- type: 'shakaDash',
- customType: {
- shakaDash: function(video, player) {
- var src = video.src;
- var playerShaka = new shaka.Player(video); // 将会修改 video.src
- playerShaka.load(src);
- },
- },
- },
- });
#FLV
需要在 DPlayer.min.js 前面加载 flv.js。
Load demo
- <link rel="stylesheet" href="DPlayer.min.css" />
- <div id="dplayer"></div>
- <script src="flv.min.js"></script>
- <script src="DPlayer.min.js"></script>
const dp = new DPlayer({- container: document.getElementById('dplayer'),
- video: {
- url: 'demo.flv',
- type: 'flv',
- },
- pluginOptions: {
- flv: {
- // flv config
- },
- },
- });
- console.log(dp.plugins.flv); // flv 实例
// 另一种方式,使用 customType- const dp = new DPlayer({
- container: document.getElementById('dplayer'),
- video: {
- url: 'demo.flv',
- type: 'customFlv',
- customType: {
- customFlv: function(video, player) {
- const flvPlayer = flvjs.createPlayer({
- type: 'flv',
- url: video.src,
- });
- flvPlayer.attachMediaElement(video);
- flvPlayer.load();
- },
- },
- },
- });
#WebTorrent
需要在 DPlayer.min.js 前面加载 webtorrent。
Load demo
- <link rel="stylesheet" href="DPlayer.min.css" />
- <div id="dplayer"></div>
- <script src="webtorrent.min.js"></script>
- <script src="DPlayer.min.js"></script>
const dp = new DPlayer({- container: document.getElementById('dplayer'),
- video: {
- url: 'magnet:demo',
- type: 'webtorrent',
- },
- pluginOptions: {
- webtorrent: {
- // webtorrent config
- },
- },
- });
- console.log(dp.plugins.webtorrent); // WebTorrent 实例
// 另一种方式,使用 customType- const dp = new DPlayer({
- container: document.getElementById('dplayer'),
- video: {
- url: 'magnet:demo',
- type: 'customWebTorrent',
- customType: {
- customWebTorrent: function(video, player) {
- player.container.classList.add('dplayer-loading');
- const client = new WebTorrent();
- const torrentId = video.src;
- client.add(torrentId, (torrent) => {
- const file = torrent.files.find((file) => file.name.endsWith('.mp4'));
- file.renderTo(
- video,
- {
- autoplay: player.options.autoplay,
- },
- () => {
- player.container.classList.remove('dplayer-loading');
- }
- );
- });
- },
- },
- },
- });
#配合其他 MSE 库使用
DPlayer 可以通过 customType 参数与任何 MSE 库一起使用
- <link rel="stylesheet" href="DPlayer.min.css" />
- <div id="dplayer"></div>
- <script src="pearplayer.js"></script>
- <script src="DPlayer.min.js"></script>
const dp = new DPlayer({- container: document.getElementById('dplayer'),
- video: {
- url: 'https://qq.webrtc.win/tv/Pear-Demo-Yosemite_National_Park.mp4',
- type: 'pearplayer',
- customType: {
- pearplayer: function(video, player) {
- new PearPlayer(video, {
- src: video.src,
- autoplay: player.options.autoplay,
- });
- },
- },
- },
- });
直播
你可以把 DPlayer 用在直播当中,但如果你想要直播弹幕,你需要自己准备一个 WebSocket 后端。
Load demo
初始化播放器:
- const dp = new DPlayer({
- container: document.getElementById('dplayer'),
- live: true,
- danmaku: true,
- apiBackend: {
- read: function(endpoint, callback) {
- console.log('Pretend to connect WebSocket');
- callback();
- },
- send: function(endpoint, danmakuData, callback) {
- console.log('Pretend to send danamku via WebSocket', danmakuData);
- callback();
- },
- },
- video: {
- url: 'demo.m3u8',
- type: 'hls',
- },
- });
通过 WebSocket 获取到弹幕之后,通过 dp.danmaku.draw 绘制弹幕:
- const danmaku = {
- text: 'Get a danamku via WebSocket',
- color: '#fff',
- type: 'right',
- };
- dp.danmaku.draw(danmaku);
常见问题
#为什么播放器不能全屏?
如果播放器被包含在 iframe 里,尝试在 iframe 上添加 allowfullscreen 属性。
为了完善的浏览器兼容性,它应该是这样:
- <iframe src="example.com" allowfullscreen="allowfullscreen" mozallowfullscreen="mozallowfullscreen" msallowfullscreen="msallowfullscreen" oallowfullscreen="oallowfullscreen" webkitallowfullscreen="webkitallowfullscreen"></iframe>
#为什么播放器不能在手机上自动播放?
大多数移动端浏览器禁止了视频自动播放。
开源地址:https://github.com/MoePlayer/DPlayer