MENU

Typecho 引入 DPlayer 的简单方法

2019 年 05 月 29 日 • 阅读: 17665 • 博客

想在文章中插入视频,尝试 iframevideo 标签后发现 m3u8 流会触发下载无法播放,用 hls 该问题后,碰到了 403 forbbiden。联想到前些天新浪图床加 referrer 的解决方法,随手一试竟然可以。后来发现 Mixed ContentCORS 才是大坑,几经了解,这个问题只能靠视频源服务器解决,所以把视频放在自己的服务器或 CDN 是不会有问题的。最后,用 js 封装了一下神器 DPlayer,使用体验良好。

演示效果

Set danmaku color
Set danmaku type
00:00 / 0:00
Speed
Loop
Show danmaku
Unlimited danmaku
Opacity for danmaku
0.5
0.75
Normal
1.25
1.5
2
[x]
Player version
Player FPS
Video type
Video url
Video resolution
Video duration

引入 JS

对于 本主题,依次进入 控制台 - 外观 - 设置外观 - 主题自定义扩展,将代码加入到 自定义 HTML 元素拓展 - 标签: head 头部 (meta 元素后)。其他主题,加入到主题对应的 header.php 中的 </head> 标签前。

JavaScript Code

  • <script>
  • // DPlayer API
  • document.addEventListener('DOMContentLoaded', initDplayer);
  • function initDplayer() {
  • const common = {
  • loadResource: function (id, resource, type, callback) {
  • let loaded = document.head.querySelector('#' + id);
  • if (loaded) {
  • callback();
  • return;
  • }
  • const element = document.createElement(type);
  • element.onload = element.onreadystatechange = () => {
  • if (!loaded && (!element.readyState || /loaded|complete/.test(element.readyState))) {
  • element.onload = element.onreadystatechange = null;
  • loaded = true;
  • callback();
  • }
  • }
  • if (type === 'link') {
  • element.rel = 'stylesheet';
  • element.href = resource;
  • } else {
  • element.src = resource;
  • }
  • element.id = id;
  • document.getElementsByTagName('head')[0].appendChild(element);
  • },
  • loadResources: function (callback) {
  • const cdn = '//s0.pstatp.com/cdn/expire-1-M';
  • const resources = [
  • '/dplayer/1.25.0/DPlayer.min.css',
  • '/dplayer/1.25.0/DPlayer.min.js',
  • '/hls.js/0.12.4/hls.light.min.js',
  • '/flv.js/1.5.0/flv.min.js'
  • ];
  • let unloadedResourceCount = resources.length;
  • resources.forEach(resource => {
  • this.loadResource(btoa(resource).replace(/[=+\/]/g, ''), cdn + resource,
  • ({
  • 'css': 'link',
  • 'js': 'script'
  • })[resource.split('.').pop()],
  • () => --unloadedResourceCount ? null : callback()
  • );
  • });
  • },
  • createDplayers: function (sources, callback) {
  • for (let i = 0; i < sources.length; i++) {
  • const child = document.createElement('div');
  • const src = sources[i].getAttribute('src');
  • sources[i].parentNode.insertBefore(child, sources[i]);
  • sources[i].style.display = 'none';
  • const type = src.split('.').pop();
  • const option = { url: src };
  • type === 'flv' ? option.type = type : null;
  • const dplayer = new DPlayer({ container: child, preload: 'none', autoplay: false, screenshot: false, video: option });
  • }
  • if (typeof callback === 'function') callback();
  • }
  • };
  • const mirages = {
  • isMirages: function () { return window.Mirages || false },
  • fixVideoSize: function (length) {
  • let outerTimer = false;
  • const outerInterval = setInterval(() => {
  • if (outerTimer) return;
  • const videos = document.getElementsByTagName('video');
  • if (videos.length === length) {
  • const dplayerWraps = document.querySelectorAll('.dplayer-video-wrap');
  • for (let i = 0; i < length; i++) {
  • const videoContainers = dplayerWraps[i].querySelectorAll('.video-container.video-4-3');
  • if (videoContainers.length) {
  • videoContainers[0].style = 'position: initial;';
  • videoContainers[0].className = 'video-container video-16-9';
  • console.log('video-4-3 fixed.');
  • } else {
  • const videoContainer = document.createElement('div');
  • videoContainer.style = 'position: initial;';
  • videoContainer.className = 'video-container video-16-9';
  • videoContainer.appendChild(videos[i]);
  • dplayerWraps[i].appendChild(videoContainer);
  • console.log('video-16-9 inserted.');
  • const targetNode = videoContainer;
  • const config = { childList: true };
  • const callback = (mutationsList, observer) => {
  • const newVideoContainers = videoContainer.querySelectorAll(
  • '.video-container.video-4-3');
  • if (newVideoContainers.length) {
  • newVideoContainers[0].className = '';
  • console.log('auto inserted video-4-3 fixed.');
  • observer.disconnect();
  • }
  • };
  • const observer = new MutationObserver(callback);
  • observer.observe(targetNode, config);
  • setTimeout(() => observer.disconnect(), 1000 * 120);
  • }
  • }
  • outerTimer = true;
  • clearInterval(outerInterval);
  • }
  • }, 500);
  • }
  • };
  • const dps = document.getElementsByTagName('dp');
  • if (dps.length !== 0) {
  • common.loadResources(() => common.createDplayers(dps, () => {
  • // 修正 Mirages 视频比例错误
  • mirages.isMirages() ? mirages.fixVideoSize(dps.length) : null;
  • }));
  • }
  • };
  • </script>

如果你开启了 PJAX,可能需要单独加入回调函数。对于本主题,依次进入 控制台 - 外观 - 设置外观 - PJAX(BETA) - PJAX RELOAD,将 initDplayer(); 添加进入即可。

添加播放器

在文章所需位置以 html 形式插入代码,即可添加播放器,支持 m3u8mp4flvmkv 格式,不过编码必须是 H.264 AAC

  • !!!
  • <dp src="demo.mp4"></dp>
  • !!!
TG 大佬群 QQ 大佬群

最后编辑于: 2021 年 06 月 12 日
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
添加新评论

Loading captcha...

  • OωO
  • |´・ω・)ノ
  • ヾ(≧∇≦*)ゝ
  • (☆ω☆)
  • (╯‵□′)╯︵┴─┴
  •  ̄﹃ ̄
  • (/ω\)
  • ∠( ᐛ 」∠)_
  • (๑•̀ㅁ•́ฅ)
  • →_→
  • ୧(๑•̀⌄•́๑)૭
  • ٩(ˊᗜˋ*)و
  • (ノ°ο°)ノ
  • (´இ皿இ`)
  • ⌇●﹏●⌇
  • (ฅ´ω`ฅ)
  • (╯°A°)╯︵○○○
  • φ( ̄∇ ̄o)
  • ヾ(´・ ・`。)ノ"
  • ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
  • (ó﹏ò。)
  • Σ(っ °Д °;)っ
  • ( ,,´・ω・)ノ"(´っω・`。)
  • ╮(╯▽╰)╭
  • o(*////▽////*)q
  • >﹏<
  • ( ๑´•ω•) "(ㆆᴗㆆ)
  • (。•ˇ‸ˇ•。)
  • 泡泡
  • 阿鲁
  • 蛆音娘
  • 小埋
  • 颜文字

已有 20 条评论
  1. 强调几点:(该留言由系统自动生成!)
    1. 请不要刷广告,本站没有流量!
    2. 我不回复虚假邮箱,因为回复了你也看不到!
    3. 存在必须回复的隐藏内容时,可以直接使用表情框里的阿鲁表情!

  1. sam900 sam900   Windows 10 x64 Edition  Google Chrome 131.0.0.0

    hi

  2. DPlayer-Typecho, 的本质是文本替换,不是很好用,禁用插进就不能正常使用了,而且加载了这个插件,反应轻微慢了一丢丢,引入外部 js, 控制台会不干净

  3. zizdog zizdog   Windows 10 x64 Edition  Google Chrome 96.0.4664.55

    直接用插件也挺好的。

  4. 阿斯蒂芬 阿斯蒂芬   Windows 10 x64 Edition  Google Chrome 93.0.4577.82

    我测试一下头像哈

  5. 月下读心 月下读心   Windows 10 x64 Edition  Google Chrome 77.0.3865.120

    怎么引用 b 站弹幕呢?

    1. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 80.0.3987.132

      @月下读心之前没考虑加弹幕,具体阅读官方文档
      https://dplayer.js.org/zh/guide.html#bilibili-%E5%BC%B9%E5%B9%95

    2. 月下读心 月下读心   Windows 10 x64 Edition  Google Chrome 77.0.3865.120

      @LOGI 用了插件,pjax 回调出问题了quyin hematemesis
      ![就这](https://i.loli.net/2020/03/15/NbsvAGwgyl3TtPf.png)

    3. 月下读心 月下读心   Windows 10 x64 Edition  Google Chrome 77.0.3865.120

      @月下读心图:https://i.loli.net/2020/03/15/NbsvAGwgyl3TtPf.png

    4. LOGI LOGI   Windows 7 x64 Edition  Google Chrome 80.0.3987.122

      @月下读心放你博客链接,我去看一下

    5. 月下读心 月下读心   Windows 10 x64 Edition  Google Chrome 77.0.3865.120

      @LOGI 这 https://nianshaoke.cn/archives/198

    6. LOGI LOGI   Windows 7 x64 Edition  Google Chrome 80.0.3987.122

      @月下读心我过去看挺正常的,或许你可以 ctrl + f5 刷新下

    7. 月下读心 月下读心   Windows 10 x64 Edition  Google Chrome 77.0.3865.120

      @LOGI 感谢大佬

  6. 小童 小童   Windows 10 x64 Edition  Google Chrome 79.0.3945.130

    大佬,你说新浪图床加 referrer 的解决方法是指添加 add_header Referrer-Policy "no-referrer"; 这个吗?
    我试过把这个加进宝塔网站配置文件中,加了没有效果诶

    1. LOGI LOGI   Windows 7 x64 Edition  Google Chrome 79.0.3945.130

      @小童是在 head 里面加,不过那样有副作用。现在建议反代,或者最好用自己的 cdn

    2. 童   Windows 10 x64 Edition  QQ 浏览器 10.5.3863.400

      @LOGI 想暂时用这个方法恢复那些失效的图片文件然后一个个下载下来.....
      那个大佬的微博图片本地化太复杂了,我不会正则循环什么的只好用这个慢方法了

    3. LOGI LOGI   Windows 7 x64 Edition  Google Chrome 79.0.3945.130

      @童那位大佬关键步骤都给了,不过跳过了数据库导出等零散步骤。我有时间再写一篇详细点的吧

    4. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 80.0.3987.106

      @童我写了一篇帖子你看看

      https://logi.im/blog/a-whole-review-of-sinaimg-server-referrer-limitation.html

  7. Xin Xin   Windows 7 x64 Edition  Google Chrome 75.0.3770.100

    本站已启用,谢谢站长耐心指导

  8. Kevan Kevan   Mac OS X 10.14.3  Google Chrome 75.0.3770.100

    很实用了,打算给自己的加上

    1. LOGI LOGI   Windows 10 x64 Edition  Google Chrome 75.0.3770.100

      @Kevan 感谢支持,交换一下友链吧