<video>标签不支持播放某种视频格式时如何做出提示?

<video>标签不支持播放某种视频格式时如何做出提示?

前言

最近公司的门户系统突然来了个播放视频的需求,由于时间仓促并且业务也没给出具体而又明确而又细致的需求文档,并且只需支持IE11与chrome70以上版本,我第一时间选用H5中浏览器自带的<video>\color{#26c6da}{<video>}<video> 标签实现,哼哼,那就来吧!(项目使用React)

胸有成竹一顿操作

    import React, { useState } from 'react';
    import { Spin } from 'antd';
    
    const VideoPlayer = props => {
      const { fileUrl, videoUrl, loading } = props
    
      return (
        <div style={{ position:'relative', width: 800, height: 450 }} >
          <Spin spinning={loading} style={{ marginTop: '150px' }}>
            {videoUrl && (
              <video
                style={{ width: 800, height: 450, cursor: 'pointer', background: 'black' }}
                controls
                controlsList='nodownload'
                post={fileUrl}
                disablePictureInPicture
                onLoadedDate={() => setPostUrl(fileUrl)}
              >
                <source src={videoUrl} />
              </video> 
             )}
          </Spin>
        </div>
      )
   }

写完后发到SIT环境一测,嘶~,怎么回事?!怎么上传的视频播放不了。作为面向搜索引擎开发的我来说,这个当然不是问题。一经调查,果然,不同浏览器中,<video>标签对不同的视频格式支持度相同不了一点儿,总有那么几个“高级的”视频格式需要很高版本的浏览器才支持,比如什么.avi啊,H264的mp4啊...音视频格式相关知识请兄弟们看这儿Media container formats (file types) - Web 媒体技术 | MDN (mozilla.org)

解决方案

很好,既然你不支持,那我就,,,我就想办法(不然还能咋整啊);当时脑子里闪过好几个念头:后端给支持下转码?上传时后端给加个格式校验?实在不行前端就用个插件吧?等等。其实办法还是很多的,但是时间不够了,不能苦了兄弟们不是。尤其是组里那几个天天摸鱼的后端小子奥(狗头保命)!既然技术上有困难,那就只能委屈委屈需求的提出者了,咳咳!
为了用户体验咱就播放的时候加点儿提示吧,<video>标签有个特点,视频播放不了时(地址有问题啊、文件损坏啊、格式不支持啊),只会出现一个无资源的播放器。那我就可以找个事件\color{purple}{事件}事件监听这个video能不能正常播放,然后再更新状态,来给他加个蒙层上面提示不支持该视频格式之类的话,然后在提供下载按钮下到本地看去吧。(我真tnd的是个天才)

solution

    import React, { useState } from 'react';
    import { Spin } from 'antd';
    
    const VideoPlayer = props => {
      const { fileUrl, videoUrl, loading } = props
    
      //提示信息遮罩
      const [tipsVisible, setTipsVisible] = useState(false)
      //让封面图放在视频可加载后加载,优化视频不可播放却闪现封面图
      const [postUrl, setPostUrl] = useState('')
    
      return (
        <div style={{ position:'relative', width: 800, height: 450 }} >
          <p
            width: '100%',
            height: '100%',
            fontSize: '18px',
            color: '#fff',
            display: tipsVisible ? 'flex' : 'none',
            flexDirection: 'column',
            justifyContent: 'center',
            alignItems: 'center',
            position: 'absolute',
            backgroundImage: 'linear-gradient(173deg, #343434 0%, #000 100%)'
          >
            <img src={require(''@/assets/home/disabledVideo.svg)} />
            <span style={{ marginBottom: 10, marginTop: 30 }} >
              视频可能损坏或者当前浏览器不支持此格式视频
            </span>
            <span>请更换浏览器或联系管理员解决</span>
          </p>
          <Spin spinning={loading} style={{ marginTop: '150px' }}>
            {videoUrl && (
              <video
                style={{ width: 800, height: 450, cursor: 'pointer', background: 'black' }}
                controls
                controlsList='nodownload'
                post={postUrl}
                disablePictureInPicture
                onError={() => setTipsVisible(true)}
                onLoadedDate={() => setPostUrl(fileUrl)}
              >
                <source src={videoUrl} />
              </video> 
             )}
          </Spin>
        </div>
      )
   }

其他

当然,一定还有很多其他方案,比如,,,欢迎兄弟姐妹们来讨论啊,快来快来~ (工作三年还是个菜鸡,决定以博客起步,监督自己奋发图强,希望大家多多支持鼓励!!!)

全部评论

相关推荐

mjasjon:这种trash中厂 简历过筛概率比大厂还低(除阿里系)
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
豆泥🍀:同26届,加油,我也还没找到查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务