video 标签 详解

更多请查看:https://www.w3school.com.cn/jsref/dom_obj_video.asp

  1. <video
  2. class="video-source"
  3. width="100%"
  4. height="200px"
  5. src=""
  6. preload="auto" /* 这个属性规定页面加载完成后载入视频*/
  7. controls /* 设置是否显示播放器控件(如播放/暂停等) */
  8. loop="loop" /* 设置或返回视频是否应在结束时再次播放 */
  9. webkit-playsinline="true" /* 针对ios9不全屏播放 */
  10. playsinline="true" /* 针对ios10、11不全屏播放 */
  11. x5-video-player-type="h5-page" /* 启用X5内核同层渲染 */
  12. x5-video-orientation="portraint" /* 播放器方向,landscape横屏,portraint竖屏,默认值为竖屏 */
  13. x5-video-player-fullscreen="true" /* 全屏设置,设置为 true 是防止横屏 */
  14. x5-playsinline="true" /* 设置X5内核为行内播放模式,不能和`x5-video-player-type同时设置会覆盖 */
  15. x-webkit-airplay="true" /* 默认不全屏播放 */
  16. x5-video-ignore-metadata="true"
  17. />

preload=”auto”

属性规定是否在页面加载后载入视频。

注:如设置了 autoplay 属性,则忽略该属性。

  • auto - 当页面加载后载入整个视频
  • meta - 当页面加载后只载入元数据
  • none - 当页面加载后不载入视频

autoplay

自动播放
自动播放不推荐的方案:

  • 设置autoplay属性,由于浏览器本身限制,设置该属性没有生效。浏览器(Google Chrome)上可以设置muted(静音)可自动播放,但效果并不理想,不推荐。
  • 直接调用play() 方法
  • 通过js主动触发click事件
  • 监听touchstart事件,调用play()方法,可以实现,但需要用户触发一次touchstart,可作为降级方案,并不建议采用。

iOS 微信内通过监听WeixinJSBridgeReady事件,调用play()事件,可实现自动播放功能

  1. document.addEventListener('WeixinJSBridgeReady', () => {
  2. this.videoPlay();
  3. }, false);
  4. videoPlay() {
  5. if (this.$refs.liveVideo) {
  6. this.$refs.liveVideo.play();
  7. }
  8. },

注:
如果视频地址是通过接口返回的,直接调用play方法会出现自动播放失败,因为WeixinJSBridgeReady只触发一次。
可以采用定时器连续调用的方式解决问题
处理代码如下:

  1. methods: {
  2. repeatVideoPlay() {
  3. // loadStatus 为接口返回后状态
  4. if (this.loadStatus) {
  5. this.videoPlay();
  6. } else {
  7. setTimeout(() => {
  8. this.repeatVideoPlay();
  9. }, 2000);
  10. }
  11. },
  12. videoPlay() {
  13. if (this.$refs.liveVideo) {
  14. this.$refs.liveVideo.play();
  15. }
  16. },
  17. },
  18. created() {
  19. document.addEventListener("WeixinJSBridgeReady", this.repeatVideoPlay, false);
  20. },
  21. destroyed() {
  22. document.removeEventListener("WeixinJSBridgeReady", this.repeatVideoPlay, false);
  23. },

playsinline与webkit-playsinline

如果你不希望用户来拖动进度条的话,可以直接使用 playsinline属性,webkit-playsinline属性
如果是想做全屏直播或者全屏H5体验的用户,iOS需要删除这个属性(设置false不生效),安卓则不需要,因为默认全屏

X5 内核两种播放状态

官方文档:TBS腾讯浏览器服务 - H5同层播放器

页面内播放

X5内核视频在用户点击后默认会进入全屏播放,前端可以设置 videox5-playsinline 属性来将视频限定于网页内部播放。

  1. <video
  2. width="300"
  3. height="300"
  4. src="https://tbm-auth.alicdn.com/e7qHgLdugbzzKh2eW0J/kXTgBkjvNXcERYxh2PA%40%40hd_hq.mp4?auth_key=1631498860-0-0-7d175e8f2c2cab984708d2a5b3f17eac"
  5. x5-playsinline
  6. controls
  7. ></video>

同层页面内播放

同层播放,就是在视频全屏的时候,div可以呈现在视频层上,WeChat(x5内核)特有的属性。 同层页面内播放是标准的视频播放形态,在 video 标签中添加且只需要添加一个(不要与 **x5-playsinline** 同时存在): x5-video-player-type='h5-page' 属性来控制网页内部同层播放,可以在视频上方显示 html 元素。

  1. <video
  2. id="video"
  3. width="300"
  4. height="300"
  5. src="https://tbm-auth.alicdn.com/e7qHgLdugbzzKh2eW0J/kXTgBkjvNXcERYxh2PA%40%40hd_hq.mp4?auth_key=1631498860-0-0-7d175e8f2c2cab984708d2a5b3f17eac"
  6. controls
  7. preload
  8. loop="loop"
  9. x5-video-player-type="h5-page"
  10. ></video>

腾讯浏览服务,常见的音视频问题

Android 遇到的问题

如果视频没有播放的情况,双击进度条快进会吧整个video播放不了的情况出现,导致出现该问题的原因暂时不知什么原因引起

解决方法:添加一个蒙层,点击蒙层就播放视频,短暂的处理方案
完整代码如下:

  1. <template>
  2. <div class="video_box">
  3. <div class="cover" @click.stop.prevent="play" v-if="!played"></div>
  4. <video
  5. :src="src"
  6. :poster="poster"
  7. :id="`videoElement${index}`"
  8. controls
  9. playsinline
  10. webkit-playsinline
  11. webkit-inline
  12. x5-video-player-type="h5-page"
  13. x5-video-player-fullscreen="true"
  14. x-webkit-airplay="allow"
  15. x5-video-orientation="portraint"
  16. />
  17. </div>
  18. </template>
  19. <script>
  20. export default {
  21. props: {
  22. src: {
  23. type: String,
  24. default: "",
  25. },
  26. poster: {
  27. type: String,
  28. default: "",
  29. },
  30. index: {
  31. type: Number,
  32. default: 0,
  33. },
  34. },
  35. data() {
  36. return {
  37. played: false,
  38. };
  39. },
  40. methods: {
  41. play() {
  42. document.getElementById(`videoElement${this.index}`).play();
  43. this.played = true;
  44. },
  45. },
  46. };
  47. </script>
  48. <style lang="scss" scoped>
  49. .video_box {
  50. position: relative;
  51. width: 100%;
  52. height: 194px;
  53. .cover {
  54. position: absolute;
  55. left: 0;
  56. top: 0;
  57. width: 100%;
  58. height: 100%;
  59. z-index: 1000;
  60. }
  61. video {
  62. position: absolute;
  63. left: 0;
  64. top: 0;
  65. width: 100%;
  66. height: 100%;
  67. }
  68. }
  69. </style>

video 属性返回 Infinity

解决参考:https://stackoverflow.com/questions/38443084/how-can-i-add-predefined-length-to-audio-recorded-from-mediarecorder-in-chrome

  1. <video
  2. controlslist="nodownload"
  3. playsinline=""
  4. webkit-playsinline=""
  5. x5-video-player-type="h5-page"
  6. x-webkit-airplay="true"
  7. autoplay="autoplay"
  8. controls="controls"
  9. preload="auto"
  10. style="width: 100%;height: auto;"
  11. src=""
  12. ></video>
  13. var player = document.querySelector("video");
  14. window.onload = function () {
  15. // 获取总时长
  16. player.addEventListener("durationchange", (event) => {
  17. console.log(player.duration);
  18. // Infinity
  19. })
  20. // 监听缓存进度
  21. player.addEventListener("progress", (event) => {
  22. let bufvalue = player.buffered.end(player.buffered.length - 1);
  23. console.log(parseInt(bufvalue));
  24. // Infinity
  25. })
  26. }

前端 video 直播场景时,对延迟比较高要求(电商秒杀等场景)的可以通过监控 progress 来达到效果

  1. // TODO:设置currentTime为最新的播放时长要控制好频率与快进时长,要不然会导致一直loading加载新的TS片段
  2. var player = document.querySelector("video");
  3. var videoCanskip = 0;
  4. player.addEventListener("progress", function (event) {
  5. // 返回表示音频/视频已缓冲部分的 TimeRanges 对象。
  6. var startBuffered = player.buffered.start(0);
  7. var endBuffered = player.buffered.end(0);
  8. videoCanskip = parseInt(endBuffered - startBuffered);
  9. console.log("video_可快进时长" + Math.ceil(videoCanskip));
  10. }
  11. // 设置currentTime 值 来播放最新内容
  12. player.currentTime = videoCanskip;

解决ios video audio无法自动播放、循环播放的问题

writing….