视频播放

2020/01/22 功能实现 共 3693 字,约 11 分钟

背景

项目中sdk的视频播放在 ios 和安卓手机表现形式不一致,不满足产品需求。针对ios手机单独做处理,也就是借用原生的 video 实现

需求

页面ui展示

点击播放手机全屏展示

中途退出全屏或者播放结束展示(页面停留在退出那一帧

实现

video 标签

<video
  :poster="videoObj.coverUrl"// 展示视频第一帧
  :src="videoObj.playUrl"
  ref="video"
  webkit-playsinline="true"
  playsinline="false"//是否小屏播放
  x-webkit-airplay="true"
  x5-video-player-type="h5" /启用H5播放器,是wechat安卓版特性*/
  x5-video-player-fullscreen="true"/*全屏设置,设置为 true 是防止横屏*/
  x5-video-ignore-metadata="true"
  width="100%"
  height="100%"
></video>
// 自己写的播放按钮,用来控制,点击视频全屏播放
<img class="video-play"
      v-show="!videoObj.hiddenVideoPlay"
      @click="playVideo_ios"
      :src="videoImg" />

没有加 controls 属性,去掉控制条

视频H5 video标签最佳实践

  watch: {
    'videoObj.hiddenVideoPlay': {
      handler(newVal, o) {
        if (!newVal) {
          this.$refs.video.pause()// 播放视频
        } else {
          this.$refs.video.play()//暂停视频播放
        }
      },
      deep: true
    }
  },
    mounted() {
    this.showVideoPlay()
  },
    methods: {
    playVideo_ios() {// 点击播放按钮控制视频的播放
      this.$refs.video.play()
      this.$emit('videoStatus', this.videoObj, 'play')//告诉父组件,修改hiddenVideoPlay状态,隐藏播放按钮
    },
    showVideoPlay() {
      // 监听开始播放事件
      this.$refs.video.onplay = () => {
        console.log(this.$refs,'查看video 上面的方法和属性');
        const video = this.$refs.video
        if (video.webkitEnterFullscreen) {
          video.webkitEnterFullscreen()//播放的时候全屏展示
        } else if (video.webkitEnterFullScreen) {
          video.webkitEnterFullScreen()////播放的时候全屏展示
        } else {
          console.log('没有全屏', video)
        }
      }
      // 监听暂停
      this.$refs.video.onpause = () => {
        console.log('暂停')
        if (this.videoObj.hiddenVideoPlay) {
          this.$emit('videoStatus', this.videoObj, 'pause')//告诉父组件,修改hiddenVideoPlay状态,显示播放按钮
        }
      }
      // 结束播放
      this.$refs.video.onend = () => {
        console.log('结束播放')
        if (this.videoObj.hiddenVideoPlay) {
          this.$emit('videoStatus', this.videoObj, 'pause')//告诉父组件,修改hiddenVideoPlay状态,显示播放按钮
        }
      }
    }
  }
  // 样式修改
  .video-img {
  width: 230px;
  height: 170px;
  position: relative;
  margin-bottom: 16px;

  .video-play {
    width: 50px;
    height: 50px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }

  video {
    object-fit: cover;
  }
  }

因为只考虑 ios 手机,所以兼容性相对而言,比较容易处理。再加上同事在疫情期间做了很多关于 video 的视频播放处理,要感谢她,帮我把坑踩平了,我只要

借用第三方插件

  <video ref="videoPlayer" class="video-js" :poster="videoObj.coverUrl">
    <source :src="videoObj.playUrl && videoObj.playUrl" type="video/mp4" />
  </video> 
  mounted() {
    this.showVideoPlay()
  },
  methods:{
    showVideoPlay(e) {
      let _this = this
      setTimeout(() => {
        // 播放参数
        let options = {
          controls: true, // 是否显示底部控制栏
          preload: 'auto', // 加载<video>标签后是否加载视频
          width: '230',
          height: '170'
        }
        this.player = this.$video(this.$refs.videoPlayer, options, function onPlayerReady() {
          console.log('onPlayerReady', this)
          // 音频开始播放
          this.on('play', () => {
            console.log('play ')
          })
          // 音频暂停播放
          this.on('pause', function() {
            console.log('视频暂停播放')
          })
        })
      }, 500)
    }
  }
  // 修改第三方默认样式,尽可能的满足UI
    .vjs-big-play-button {
    font-size: 20px;
    line-height: 40px;
    height: 40px;
    width: 40px;
    display: block;
    position: absolute;
    transform: translate(-50%, -50%);
    top: 50%;
    left: 50%;
    padding: 0;
    cursor: pointer;
    opacity: 1;
    border: 1px solid #fff;
    background-color: #2b333f;
    background-color: rgba(43, 51, 63, 0.7);
    border-radius: 50%;
  }

  .vjs-playing .vjs-big-play-button {
    display: none;
  }
  .vjs-poster {
    background-size: cover;
  }
  .vjs-paused .vjs-control-bar {
    display: none;
  }

如何定位修改动态变化的第三方样式??比如videojs

Video.js and Vue integration

Video.js Options Reference

Player(tag, optionsopt, readyopt)

最终没有采用 Videojs 是因为功能太强大,生成了很多我不需要的dom节点,包太大,很多其实我都不需要,而且因为引入了他,导致我页面另外一个页面交互直接卡死了。初步定位是耗性能,最后使用了原生的 video 实现。我页面另外一个交互没有任何影响

总结

新用一个标签或者属性的时候,看文档,不断的尝试。看看你需要什么方法,看看有没有你要的方法,坑才多了自然就不吭了

全屏 API

扩展媒体的MediaSession

之前看到过一篇《实现类似 BiLiBiLi 的播放浮层控制》这个文章,具体的网址我已经忘记了。大概内容讲的是:chrome浏览器可以实现的一种画中画的效果

  1. 我浏览器打开一个正在播放的视频=>看截图的操作

  1. 开启画中画的模式之后去干别的事情

  2. 大概效果就是这样,网页播放视频,开启了画中画的模式之后,就像是一个视频播放软件开启一样,把网页藏起来,视频依旧在

  3. 好像很有意思哟,而且也不难,就是简单的调用浏览器api,别的啥也不用做,代码很少的

打开网址试一试

实现思路:

  1. 浏览器的Media Session API 的MediaSession 接口允许页面为标准媒体交互提供自定义行为.

  2. MediaSession 接口里面有一个metadata属性他可以控制当前播放媒体的信息即封面/作者/等信息

  3. MediaSession 接口里面有一个setActionHandler()方法,他可以监听一个动作并且执行一个函数

  4. 一个属性控制导航栏那里的信息,一个方法监听当前操作,结合在一起就可以实现那个效果了

在不兼容的情况下,这个还是很香的。最近开始接触写原生js,不借助框架,自己写,忽然也觉得好香呀。


在技术的历史长河中,虽然我们素未谋面,却已相识已久,很微妙也很知足。互联网让世界变得更小,你我之间更近。

在逝去的青葱岁月中,虽然我们未曾相遇,却共同经历着一样的情愫。谁的青春不曾迷茫或焦虑亦是无奈,谁不曾年少过

在未来的日子里,让我们共享好的文章,共同学习进步。有不错的文章记得分享给我,我不会写好的文章,所以我只能做一个搬运工

我叫 sunseekers(张敏) ,千千万万个张敏与你同在,18年电子商务专业毕业,毕业后在前端搬砖

如果喜欢我的话,恰巧我也喜欢你的话,让我们手拉手,肩并肩共同前行,相互学习,互相鼓励

文档信息

Search

    Table of Contents