查看原文
其他

【第2009期】实现 Bilibili 视频播放Chrome 媒体控制效果

jackpu 前端早读课 2021-03-03

前言

这个API挺酷的,直接把画中画都集成进去了。今日早读文章由阿里@蒲欢授权分享。

正文从这开始~~

Chrome 最新的版本更新了媒体控制菜单的按钮 UI,也就是每次我们的网页产生声音或者视频时候,菜单栏头像附近,方便我们在多个 Tab 进行控制时候加的,方便我们操作这些网页 Tab 下面的音视频。

尤其最新的样式实现非常酷炫,加入对封面的支持,这样整体效果看着非常棒。

很早之前我们写过一篇关于 使用 mediaSession 实现媒体播放的通知栏控制 这里介绍了我们如何在网页播放音频的时候锁屏控件如何显示当前播放音乐的封面和简介,或者控制上一曲下去。

同意视频播放现在也可以,你只需要监听 MediaSession 的相关事件然后设置 mediaSession MetaData 的信息就好。

设置封面标题

  1. if ('mediaSession' in navigator) {

  2. var data = mediaList[index]

  3. navigator.mediaSession.metadata = new MediaMetadata({

  4. title: data.title,

  5. artist: data.director,

  6. artwork: [

  7. { src: data.cover, sizes: '192x192' }

  8. ]

  9. });

  10. }


进行播放控制

  1. // $video has been attached with the DOM element

  2. if ('mediaSession' in navigator) {

  3. var ms = navigator.mediaSession

  4. ms.setActionHandler('play', function () {

  5. $video.play()

  6. });

  7. ms.setActionHandler('nexttrack', function () {

  8. playNext()

  9. });

  10. ms.setActionHandler('previoustrack', function () {

  11. playPrev()

  12. });

  13. ms.setActionHandler('pause', function() {

  14. $video.pause()

  15. });

  16. }


这个在 Android 手机上依旧有效

具体实现代码

  1. <!doctype html>

  2. <html lang="en">


  3. <head>

  4. <title>实现类似 BiLiBiLi 的播放浮层控制</title>

  5. <meta charset="utf-8">

  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">

  7. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">

  8. <link rel="stylesheet" href="/fwc//cdn.jsdelivr.net/bootstrap/3.3.6/css/bootstrap.min.css" />


  9. <style type="text/css">

  10. html {

  11. font-family: sans-serif;

  12. -ms-text-size-adjust: 100%;

  13. -webkit-text-size-adjust: 100%;

  14. font-size: 62.5%;

  15. -webkit-tap-highlight-color: transparent

  16. }


  17. body {

  18. font-family: 'Helvetica Neue', '\5FAE\8F6F\96C5\9ED1', '\9ED1\4F53', sans-serif;

  19. letter-spacing: .01rem;

  20. font-size: 15px;

  21. line-height: 1.75em;

  22. color: #3A4145;

  23. -webkit-font-feature-settings: 'kern'1;

  24. -moz-font-feature-settings: 'kern'1;

  25. -o-font-feature-settings: 'kern'1;


  26. }


  27. h1 {

  28. padding-top: 40px;

  29. text-align: center;

  30. }


  31. .main {

  32. max-width: 720px;

  33. margin: 80px auto;

  34. text-align: center;

  35. }


  36. .main video {

  37. max-width: 100%;

  38. height: auto;

  39. }

  40. </style>

  41. <script src="https://lib.baomitu.com/jquery/3.4.1/jquery.min.js"></script>

  42. </head>


  43. <body class="doc">

  44. <h1>实现类似 BiLiBiLi 的播放浮层控制</h1>


  45. <div class="main">

  46. <video controls poster="https://img1.wxzxzj.com/vpc-example-cover-your-name-c.png"

  47. src="https://media.vued.vanthink.cn/sparkle_your_name_am360p.mp4" />

  48. </div>


  49. <script type="text/javascript">


  50. var mediaList = [{

  51. src: 'https://media.vued.vanthink.cn/CJ7%20-%20Trailer.mp4',

  52. cover: 'https://img1.wxzxzj.com/vpc-example-cover-CJ7-c.jpg',

  53. title: "长江七号-周星驰导演作品,关于外星人的童话故事"

  54. }, {

  55. src: 'https://media.vued.vanthink.cn/sparkle_your_name_am360p.mp4',

  56. cover: 'https://img1.wxzxzj.com/vpc-example-cover-your-name-c.png',

  57. title: "你的名字-新海诚导演作品,穿越彼此的身体,遇见不可思议"

  58. }, {

  59. src: 'https://media.vued.vanthink.cn/the_garden_of_words_trailer_english__1080p.mp4',

  60. cover: 'https://img1.wxzxzj.com/vpc-example-cover-the-garden-c.jpg',

  61. title: "言叶之庭-新海诚导演作品,下雨天静谧的动静也有唯美的相遇"

  62. }]




  63. $(function () {

  64. var $video = document.querySelector('video')

  65. var index = 1

  66. function playNext() {

  67. if (index === 2) {

  68. index = 0

  69. } else {

  70. index += 1

  71. }

  72. setMediaSession(index)

  73. $video.src = mediaList[index].src

  74. $video.play()

  75. }


  76. function playPrev() {

  77. if (index === 0) {

  78. index = 2

  79. } else {

  80. index -= 1

  81. }

  82. setMediaSession(index)

  83. $video.src = mediaList[index].src

  84. $video.play()

  85. }


  86. initMediaSession()


  87. function setMediaSession(index) {

  88. if ('mediaSession' in navigator) {

  89. var data = mediaList[index]

  90. navigator.mediaSession.metadata = new MediaMetadata({

  91. title: data.title,

  92. artist: data.director,

  93. artwork: [

  94. { src: data.cover, sizes: '192x192' }

  95. ]

  96. });

  97. }

  98. }


  99. function initMediaSession() {

  100. if ('mediaSession' in navigator) {

  101. var ms = navigator.mediaSession

  102. setMediaSession(index)


  103. ms.setActionHandler('play', function () {

  104. $video.play()

  105. });

  106. ms.setActionHandler('nexttrack', function () {

  107. console.log(3333)

  108. playNext()

  109. });

  110. ms.setActionHandler('previoustrack', function () {

  111. playPrev()

  112. });

  113. // navigator.mediaSession.setActionHandler('pause', function() { /* Code excerpted. */ });

  114. // navigator.mediaSession.setActionHandler('seekbackward', function() { /* Code excerpted. */ });

  115. // navigator.mediaSession.setActionHandler('seekforward', function() { /* Code excerpted. */ });

  116. // navigator.mediaSession.setActionHandler('previoustrack', function() { /* Code excerpted. */ });

  117. // navigator.mediaSession.setActionHandler('nexttrack', function() { /* Code excerpted. */ });


  118. }

  119. }

  120. })

  121. </script>

  122. </body>


  123. </html>

扩展阅读

  • https://developer.mozilla.org/en-US/docs/Web/API/MediaSessionAPI

  • https://caniuse.com/#search=mediasession

关于本文 作者:@蒲欢 原文:https://www.jackpu.com/ru-he-shi-xian-bilibili-shi-pin-bo-fang-chrome-mei-ti-kong-zhi-xiao-guo/

@蒲欢曾分享过


【第1819期】Web 视频播放前前后后


【第645期】写给刚入门的前端工程师的前后端交互指南


欢迎自荐投稿,前端早读课等你来

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存