账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    vue使用mediaSource拿到视频流,并且播放
    • 2020-01-01 00:00
    • 10
    44
    0

    视频文件使用的是MDN的例子的视频,所以不会存在ffmep4问题
    后端通过node createReadStream读取视频文件流,通过pipe输出响应。
    前端vue框架,主要参考了[MDN的例子],(https://developer.mozilla.org...
    拿到后端返回之后转为arraybuffer类型

    getvideosource () {
          let cid = this.$route.query.chapterId
          let path = 'http://localhost:3000/api/chapter/learning/video'
          let mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'
          // let video = this.$refs.v1
          let video = document.getElementById('v1')
          let mediaSource
          let that = this
          if('MediaSource' in window && MediaSource.isTypeSupported(mimeCodec)) {
            console.log('MediaSource')
            mediaSource = new MediaSource()
            video.src = URL.createObjectURL(mediaSource)
            mediaSource.addEventListener('sourceopen',sourceOpen.bind(this))
          } else{
            console.error('Unsupported MIME type or codec:',mimeCodec)   
          }
          function sourceOpen () {
            console.log('has opened')
            URL.revokeObjectURL(video.src)
            let sourceBuffer = mediaSource.addSourceBuffer(mimeCodec)
            fetchAB(path,sourceBuffer)
          }
          function fetchAB (url,sourceBuffer) {
            axios.get(url).then((result)=>{
              console.log(Object.prototype.toString.call(result.data));
              // console.log(result.data);
              // let data = new Blob([result.data],{type: 'application/octet-stream'})
              // console.log(Object.prototype.toString.call(data));
              // console.log(data);
              // var reader = new FileReader();
              // reader.onload = function() {
              //   console.log(this.result);
              // }
              // reader.readAsArrayBuffer(blob);
              function toArrayBuffer(buf) {
                var ab = new ArrayBuffer(buf.length);
                var view = new Uint8Array(ab);
                for (var i = 0; i < buf.length; ++i) {
                    view[i] = buf[i];
                }
                return ab;
              }
              let r = toArrayBuffer(result.data)
              console.log(Object.prototype.toString.call(r))
              sourceBuffer.addEventListener('updateend', function () {
                console.log(mediaSource.readyState);
                console.log(sourceBuffer)
                console.log(mediaSource);
                mediaSource.endOfStream()
              })
              sourceBuffer.appendBuffer(r)
            })
          }
        },
    
    以上是全部的代码。
    这个函数在mounted内调用
    浏览器运行会在mediaSource.endOfStream()处报错

    Failed to execute 'endOfStream' on 'MediaSource': The MediaSource's readyState is not 'open'.
    有大佬知道这是怎么回事吗???

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 寸渊 普通会员 1楼

      在Vue中,我们可以使用MediaSource API来获取视频流并播放。以下是一个基本的示例:

      ```html

      ```

      在这个示例中,<video>元素用于创建一个视频播放器,controls属性用于显示播放控制条。<source>元素用于指定视频文件的URL。type属性用于指定文件的类型。

      如果你想在Vue中播放视频,你需要提供一个播放API,比如videojs。你可以通过以下方式使用videojs

      ```javascript import videojs from 'videojs';

      new videojs('video', { controls: true, loop: true, autoplay: true, video: document.querySelector('video') }).play(); ```

      在这个示例中,video元素是播放器的元素。controls: trueloop: true用于启用播放控制和循环播放。autoplay: true用于自动播放视频。video: document.querySelector('video')用于获取视频元素。

      注意,videojs是一个库,它提供了更多的功能,如视频编码和解码,以及更高级的播放控制。如果你只是想在Vue中播放视频,那么上述代码应该就足够了。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部