VUEプロジェクトライブビデオVUE-ビデオプレーヤー

VUEプロジェクトライブ映像

最近のライブ電気の供給者は、火災、その後、需要の混乱物事を受けています!
関連する記事をたくさん読んで、直接使用された最後の異なる何を見ていないVUE-ビデオプレーヤー開発します。ライブストリームが返されたm3u8フォーマットを、flvフォーマットを再生することはできません、私は設定に問題がある可能性があります。そして、このプラグインで使用することができますflash私は一番下に取得していない、すべての後、Googleはほとんどあきらめましたflash

プラグインをインストールします。

npm install vue-video-player videojs-contrib-hls --save

二つのプラグインがインストールされていることを注意はvue-video-playervideojs-contrib-hls(これはに後で導入されます)

VUE-ビデオプレーヤーの使用

githubのドキュメントもここのノートを作る、非常に明確に書かれています:

モード1:グローバル参照

// main.js 文件

import Vue from 'vue'
import VueVideoPlayer from 'vue-video-player'

import 'video.js/dist/video-js.css'
// import 'vue-video-player/src/custom-theme.css'

Vue.use(
  VueVideoPlayer /* {
  options: global default options,
  events: global videojs events
} */
)

すべての後に、使用するすべてのページの必要性、これを使用して負荷にホームページ上の負担を増加させる必要はないことをお勧めしません

第二の方法:導入コンポーネントとして

import 'video.js/dist/video-js.css'
import { videoPlayer } from 'vue-video-player'
export default {
  components: {
    videoPlayer
  },
  data() {
    return {}
  }
}

導入後、されるvue-video-playerように構成

VUE・ビデオ・プレーヤ構成

<template>
  <video-player class="video-player-box" ref="videoPlayer" :options="playerOptions" :playsinline="true">
  </video-player>

  <!-- 这里有对应的操作事件,这里就不一一写了 -->
  <!--      
    customEventName="customstatechangedeventname"
    @play="onPlayerPlay($event)"
    @pause="onPlayerPause($event)"
    @ended="onPlayerEnded($event)"
    @waiting="onPlayerWaiting($event)"
    @playing="onPlayerPlaying($event)"
    @loadeddata="onPlayerLoadeddata($event)"
    @timeupdate="onPlayerTimeupdate($event)"
    @canplay="onPlayerCanplay($event)"
    @canplaythrough="onPlayerCanplaythrough($event)"
    @statechanged="playerStateChanged($event)"
    @ready="playerReadied" 
    -->
</template>

<script>
  import 'video.js/dist/video-js.css'
  import { videoPlayer } from 'vue-video-player'
  export default {
    data() {
      return {
        // 很多参数其实没必要的,也还有很多参数没列出来,只是把我看到的所有文章做一个统计
        playerOptions: {
          autoplay: false, //如果true,浏览器准备好时开始回放。(好像微信浏览器不太行)
          techOrder: ['html5'], // 需要加载的插件,如果是要兼容flash的话,必须先加载flash。顺序不能错:['flash','html5']
          flash: {
            hls: { withCredentials: false }
          },
          html5: { hls: { withCredentials: false } },
          muted: true, // 默认情况下将会消除任何音频。
          loop: false, // 导致视频一结束就重新开始。
          language: 'en', // 提示的语言 中文的话是 zh-CN
          fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
          preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
          aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
          playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度 0.7倍...
          sources: [
            // 播放的资源列表,虽然不知为何是个数组,可能是,轮流播放?
            {
              type: 'video/mp4', // 类型。
              src: 'https://cdn.theguardian.tv/webM/2015/07/20/150716YesMen_synd_768k_vp8.webm' // 视频流路径
            },
            {
              withCredentials: false, // 直播是否有播放令牌,反正我是没有
              type: 'application/x-mpegURL', // m3u8/Hls 的视频流类型
              src: 'https://us-2.wl-cdn.com/hls/20200308/a9e9c7b577d4bb05d2a66508e63f5a17/index.m3u8' // 对应播放的m3u8 路径
            }
          ],
          poster: '/static/images/author.jpg', //你的封面地址
          notSupportedMessage: '此视频暂无法播放,请稍后再试', //允许覆盖Video.js无法播放媒体源时显示的默认信息。
          controls: true, // 是否显示操作条
          controlBar: {
            // 播放的操作
            timeDivider: true, // 时间分割线
            durationDisplay: true, // 总时间
            remainingTimeDisplay: false,
            fullscreenToggle: true //全屏按钮
          }
        }
      }
    },
    mounted() {
      console.log('this is current player instance object', this.player)
    },
    computed: {
      player() {
        return this.$refs.videoPlayer.player
      }
    },
    methods: {
      // listen event
      onPlayerPlay(player) {
        // console.log('player play!', player)
      },
      onPlayerPause(player) {
        // console.log('player pause!', player)
      },
      // ...player event

      // or listen state event
      playerStateChanged(playerCurrentState) {
        // console.log('player current update state', playerCurrentState)
      },

      // player is ready
      playerReadied(player) {
        console.log('the player is readied', player)
        // you can use it to do something...
        // player.[methods]
      }
    }
  }
</script>

互換性のあるソース最初のピットは、このメディアが見つかりました。

設定の大部分の頂上に行った、または再生することはできません!

video.cjs.js 3D33:?440 VIDEOJS:ERROR:(CODE:4 MEDIA_ERR_SRC_NOT_SUPPORTED)いいえ互換性のあるソースは、このメディアが見つかりました。

ここに画像を挿入説明

この非常に単純なを解決するために、前に言及されてvideojs-contrib-hls
使用される場合、は、この文書のグローバル導入におけるmain.jsに1され
、それは方法2であれば、それに対応するコンポーネントのページの後、導入

// 如果用的是比较早的版本 比如 5.14.1 版本,则用这句引入
import 'videojs-contrib-hls/dist/videojs-contrib-hls'
// 最新的版本
import 'videojs-contrib-hls'

坑2:未定義ののEventTarget」

導入videojs-contrib-hlsしかし、エラー'EventTarget' of undefined

この上で、上記が来るvideojs-contrib-hlsの問題バージョン。異なるバージョンの導入方法は同じではありません。それだけを導入する方法について変更する必要があります。詳細については、このissussをご覧ください。
https://github.com/surmon-china/vue-video-player/issues/127

でも、ここでそれをストリーミングビデオでのVue M3U8使用。私のプロジェクトは、正しく再生することです

ピット2:なぜは実行されませんでした(私は遭遇しなかった、記事に記載されたこのピットを見てきました)

:サイードHLSより良い互換性、主にJSで参照するには設定のない(フラッシュをインストールする必要はありません)にユーザーを可能にするには、サポートの度合いHLS caniuseで見ることができhttp://caniuse.com/#search=HLS

唯一のエッジはサファリのネイティブサポートを提供し、他のブラウザでは、JSプラグインのサポートが必要です。それは長いそれOKにvideojs-のcontrib-HLSを引用していませんでしたか?❌、ピットもあります。プラグインのノートの公式文書でピット:

ネイティブHLSの実装とは異なり、HLSの技術は、ブラウザのセキュリティポリシーに準拠する必要があります。ストリームを構成するすべてのファイルは、ビデオプレーヤーやヘッダが設定され、適切なCORSを持つサーバーからのホスティングページと同じドメインから提供されなければならないことを意味します。簡単な指示は、人気のWebサーバのために利用可能であり、ほとんどのCDNは、アカウントの上の支障ターニングCORSを持つべきではありません。

意味は単純です:HLSブラウザのネイティブサポートに加えて、其他浏览器要想播 HLS,需要直播流服务端开启 CORS。

最も簡単なの一つが、デモを実行することができます

簡単なデモに固執します。長い対応するコンポーネントが導入しているとして、このデモは、最大実行することができます。多くの変数が調整する時間がなかった、見てみること自由に〜

<template>
  <div class="liveView">
    <video-player
      class="vjs-custom-skin"
      ref="videoPlayer"
      :options="playerOptions"
      @ready="onPlayerReadied"
      @timeupdate="onTimeupdate"
    >
    </video-player>

    <div class="inputWrapper">
      <div class="form-group row">
        <label for="" class="col-sm-4 col-form-label">HLS: </label>
        <div class="col-sm-8">
          <input class="form-control" type="text" placeholder="HLS url here" v-model="streams.hls" />
        </div>
      </div>
    </div>
    <div class="buttonWrapper">
      <button class="btn btn-primary" type="button" @click="enterStream">Apply</button>
    </div>
  </div>
</template>

<script>
  import { videoPlayer } from 'vue-video-player'
  import 'video.js/dist/video-js.css'
  import 'vue-video-player/src/custom-theme.css'
  // import 'videojs-contrib-hls/dist/videojs-contrib-hls'
  import 'videojs-contrib-hls'

  export default {
    name: 'live',
    components: {
      videoPlayer
    },
    data() {
      return {
        initialized: false,
        currentTech: '',
        streams: {
          rtmp: '',
          hls: ''
        },
        playerOptions: {
          overNative: true,
          autoplay: false,
          controls: true,
          techOrder: ['html5'],
          sourceOrder: true,
          flash: {
            hls: { withCredentials: false }
          },
          html5: { hls: { withCredentials: false } },
          sources: [
            {
              withCredentials: false,
              type: 'application/x-mpegURL',
              src: 'https://us-2.wl-cdn.com/hls/20200308/a9e9c7b577d4bb05d2a66508e63f5a17/index.m3u8'
            }
          ]
          // controlBar: {
          //   timeDivider: false, // 时间分割线
          //   durationDisplay: false, // 总时间
          //   progressControl: true, // 进度条
          //   customControlSpacer: true, // 未知
          //   fullscreenToggle: true // 全屏
          // },
        }
      }
    },
    computed: {
      player() {
        return this.$refs.videoPlayer.player
      },
      currentStream() {
        return this.currentTech === 'Flash' ? 'RTMP' : 'HLS'
      }
    },
    methods: {
      onPlayerReadied() {
        if (!this.initialized) {
          this.initialized = true
          this.currentTech = this.player.techName_
        }
      },
      // record current time
      onTimeupdate(e) {
        console.log('currentTime', e.cache_.currentTime)
      },
      enterStream() {
        this.playerOptions.sources[0].src = this.streams.hls
        this.playerOptions.autoplay = true
      },
      changeTech() {
        if (this.currentTech === 'Html5') {
          this.playerOptions.techOrder = ['html5']
        } else if (this.currentTech === 'Flash') {
          this.playerOptions.techOrder = ['flash']
        }
        this.playerOptions.autoplay = true
      }
    }
  }
</script>

<style scoped>
  .liveView {
    position: relative;
  }

  .selectWrapper {
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 20px;
    line-height: 30px;
    margin: 20px;
    vertical-align: baseline;
  }

  .inputWrapper {
    width: 500px;
    margin: 0 auto;
  }

  .buttonWrapper {
    text-align: center;
  }
</style>

フラッシュの使用上のコンポーネント

  • インストールする必要があるvue-video-playerだけでなくとしてvideojs-flash
  • フラッシュおよびHLSを一緒に使用する場合は、設定にtechOrderとして設定する必要があります。
{
  "techOrder": ["flash", "html5"] //而且必须flash在前面
}

喉の他のマルチステップは行きませんでした。記録上の次のステップで!

ピットがたくさんではない道に沿って、すべての後、問題が生フロントエンドで一般的です。ピット、忍耐構成を解決するために多くの方法は、常に一緒に遊んで、あります!

公開された71元の記事 ウォン称賛58 ビュー170 000 +

おすすめ

転載: blog.csdn.net/Jioho_chen/article/details/104806803