vue video 와 vue-video-player 는 영상 을 가득 채 우 는 튜 토리 얼 을 실현 합 니 다.

웹 페이지 에 비디오 재생 기 를 설치 합 니 다.저 는 보통 video.js 와 플러그 인 vue-video-player 를 사용 합 니 다.
Video.js
수요:간단 한 영상 재생 수요 에 있어 video.js 는 충분히 감당 할 수 있 습 니 다.
HTML 5 와 Flash 를 지원 하 는 비디오 플레이어 입 니 다.
1:video.js 설치
npm install -s video.js
2:main.js 파일 에 관련 파일 도입

import Video from 'video.js'
import 'video.js/dist/video-js.css'
Vue.prototype.$video = Video
3:구성 요소 에서 사용

<template>
 <div class="video_text">
  <video
   id="myVideo"
   class="video-js"
  >
   <source
    :src="videoUrl"
    type="video/mp4"
   >
  </video>
 </div>
</template>

<script>
 export default {
  name: "Video",
  data() {
   return {
    videoUrl:'...',//    
   };
  },
  mounted() {
   this.initVideo(); //        
  },
  methods: {
   initVideo() {
    //       
    let myPlayer = this.$video(myVideo, {
     //       
     controls: true,
     //      ,muted:    
     autoplay: false,
     //      
     muted:false,
     //           
     fluid:true,
     //            (      )
     width: "800px",
     //            (      )
     height: "400px"
    });
   }
  }
 };
</script>

<style lang="less">
 .video_text{
  width: 70%;
  margin: 0 auto;
 }
 video:focus{
  outline: 0;   //      
 }
 .video-js .vjs-big-play-button{
  /*            */
  width: 100px;
  height: 60px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate3d(-50%,-50%,0);
 }
</style>
4:효과 도

5:video.js 를 첨부 하 는 기본 적 인 방법

myPlayer.ready(function(){
 //                ,this       ,            (myPlayer         )
 myPlayer.play(); //  
 myPlayer.pause(); //  
 var currentTime = myPlayer.currentTime(); //      
 myPlayer.currentTime(120); //         
 var duration = myPlayer.duration(); //                  ,  : flash     !
 var buffered = myPlayer.buffered(); //    ,           
 var bufferedPercent = myPlayer.bufferedPercent(); //    ,           
 var volume = myPlayer.volume(); //        ,  0-1  
 myPlayer.volume(0.2); //        
 var width = myPlayer.width(); //       
 myPlayer.width(640); //       
 var howTallIsIt = myPlayer.height(); //       
 myPlayer.height(200); //      
 myPlayer.size(640,480); //        
 myPlayer.enterFullScreen(); //      
 myPlayer.enterFullScreen(); //        
})
그 밖 에 감청 사건 도 연결 할 수 있 습 니 다.

//           
myPlayer.on("ended", function(){
 console.log("end", this.currentTime());
});
//          
myPlayer.on("pause", function(){
 console.log("pause")
});
//      
myPlayer.removeEvent(“eventName”, function(){
 console.log("delete")
});
vue-video-player
1:vue-video-player 다운로드
npm install -s vue-video-player
2:main.js 에 관련 파일 도입

import VideoPlayer from 'vue-video-player'
require('video.js/dist/video-js.css')
require('vue-video-player/src/custom-theme.css')
//   hls,    (m3u8)     
import 'videojs-contrib-hls'
//  rtmp  
import 'videojs-flash'
//              ,      css
require('./assets/css/video_css/myvideo.css')
Vue.use(VideoPlayer)
3:구성 요소 에서 사용 합 니 다.

<template>
 <div class="my_video">
  <video-player class="video-player vjs-custom-skin"
          ref="videoPlayer"
          :playsinline="true"
          :options="videoPlayerOptions"
          @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"
  ></video-player>
 </div>
</template>

<script>
 //     
 import {videoPlayer} from 'vue-video-player'

 export default {
  name: 'VideoPlayer',
  components: {
   videoPlayer
  },
  data () {
   return {
    video:'',     //    
    fileType: 'mp4', //      
    videoUrl: '', //        
    posterUrl:'' //    
   }
  },
  mounted(){
   
  },
  methods:{
   //     
   onPlayerPlay(player) {
    //console.log('player play!', player)
   },

   //     
   onPlayerPause(player) {
    //console.log('player pause!', player)
   },

   //       
   onPlayerEnded($event) {
    this.$refs.videoPlayer.player.src(this.fileUrl)
   },

   // DOM    readyState        
   onPlayerWaiting($event) {
    //console.log(player)
   },

   //        
   onPlayerPlaying($event) {
    // console.log(player)
   },

   //                   
   onPlayerLoadeddata($event) {
    // console.log(player)
   },

   //              。
   onPlayerTimeupdate($event) {
    //console.log(player)
   },

   //   readyState HAVE_FUTURE_DATA   
   onPlayerCanplay(player) {
    // console.log('player Canplay!', player)
   },

   //   readyState HAVE_ENOUGH_DATA   。                      。
   onPlayerCanplaythrough(player) {
    // console.log('player Canplaythrough!', player)
   },

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

   //              。             ,  ready      ,         。。
   playerReadied(player) {
    //console.log('example player 1 readied', player);
   },
  },
  computed: {
   videoPlayerOptions () {
    const videoPlayerOptions = {
     playbackRates: [0.75, 1.0, 1.25, 1.5,2.0], //    
     autoplay: false, //       。
     muted: false, //       ,             。
     loop: false, //       。
     preload: 'auto', //       <video>                 。auto         ,        (       )
     language: 'zh-CN',
     aspectRatio: '3:1', //           ,                 。          -           (  "16:9" "4:3")
     fluid: true, //                  。
     flash:{hls:{withCreadentials:false}},//    rtmp  
     html5:{hls:{withCreadentials:false}},//    m3u8  
     sources: [{
      type: 'video/' + this.fileType,
      src: this.videoUrl //   url  
     }],
     poster: this.posterUrl, //     
     width: '100%',
     notSupportedMessage: '        ...', //           Video.js,       。
     controlBar: {
      timeDivider: true,
      durationDisplay: true,
      remainingTimeDisplay: false,
      fullscreenToggle: true
     }
    }
    return videoPlayerOptions
   }
  },
 }
</script>
<style scoped lang="less">
 .my_video{
  width: 100%;
  height: calc(100vh - 100px);
  background-color: white;
 }
 .video-js .vjs-big-play-button{
  /*            */
  width: 100%;
  height: 100%;
  border-radius: 50%;
 }
</style>
4:효과 도

일부 개선 사항:
1:동 영상 양쪽 여백 을 없 애 는 것,즉 동 영상 에 부모 요 소 를 가득 채 우 는 것 을 실현 하 는 것 이다.
스타일 object-fit:fill 추가 하기;영상 을 꽉 채 우 도록 하 겠 습 니 다.

video{
   width: 100% !important;
   height: calc(100vh - 95px) !important;
   object-fit:fill;  //    
  }
효과 도:(영상 좌우 양쪽 에 검 은 테두리 가 없다)

object-fit 추출 지식 보충:
fill:이 값 은 boject-fit 의 기본 값 입 니 다.내용 을 바 꾸 는 크기 는 요 소 를 채 우 는 내용 상자 로 설정 되 어 있 습 니 다.즉,요소 의 내용 은 용기 의 외형 사 이 즈 를 완전히 채 우 는 것 으로 확대 되 었 습 니 다.이것 이 내 재 된 너비 와 높이 를 깨 더 라 도.
include:요소 내용 의 크기 를 바 꾸 고 길 고 넓 은 비례 로 요소 내용 용 기 를 채 웁 니 다.구체 적 인 대상 의 크기 는 요 소 를 포함 하 는 너비 와 높이 로 분 석 됩 니 다.즉,원 소 를 교체 하 는 데 명확 한 높이 와 폭 을 설정 하면 이 값 은 내용 의 크기 를 가 져 오고 고정된 비율 로 표시 되 지만 요소 크기 에 표 시 됩 니 다.
cover:대체 요소 의 내용 크기 는 길이 와 너비 비례 로 요소 내용 용 기 를 채 웁 니 다.구체 적 인 대상 크기 는 전체 요 소 를 덮 는 너비 와 높이 로 분 석 됩 니 다.즉,대체 요소 의 내용 크기 는 길이 와 폭 비 를 유지 하지만 내용 요 소 를 완전히 덮어 쓸 수 있 도록 너비 와 높이 를 바 꾸 는 것 이다.
none:요소 내용 을 바 꾸 고 크기 를 조정 하지 않 으 며 내부 요소 에 적응 하 는 용기 입 니 다.내용 은 요소 에 설 치 된 모든 높이 와 가중치 를 무시 하고 요소 크기 에 표 시 됩 니 다.scale-down:내용 크기 가 none 또는 contact 를 설정 하면 구체 적 인 대상 이 작 아 집 니 다.
2:자가 적응 폭 실현
위 에 설 치 된 fluid:true 를 통 해 넓 은 높이 에 적응 할 수 있 지만 가끔 은 동 영상 총 높이 를 규정 하 는 수요 가 있 습 니 다.fluid 만 으로 는 적응 이 부족 합 니 다.
나의 필요 효과 도:
pc 단자:

이동 단:

내 가 만난 문제:
비디오 영상의 높이 와 폭 을 100%설정 한 후에 전체 높이 는 그 위치의 높이 를 초과 하여 많은 방법 을 시 도 했 지만 안 되 었 다.나중에 야 간단 하고 거 친 방법 으로 C 가 css 스타일 을 수정 하 는 것 을 해결 했다.(도움 이 될 것 같 으 면 다시 쓰 세 요 여러분)
메모:비디오 플레이어 옵션 에 설 치 된 fluid:true 와 aspectRatio:'16:10'을 제거 하고 css 스타일 을 바 꾸 었 습 니 다.
html 코드:

<div class="my_video">
  <video-player class="video-player vjs-custom-skin"
          id="videoDiv"
          ref="videoPlayer"
          :playsinline="true"
          :webkit-playsinline="true"
          :options="videoPlayerOptions"
  ></video-player>
 </div>
사용자 정의 css 스타일:
@media screen and(min-width:768 px){/pc 엔 드 동 영상 이 가득 깔 려 있 고 전체 용기 의 높이 를 차지 하 며 이동 단 은 동 영상 이 전체 높이 를 차지 할 필요 가 없습니다.동 영상 이 길 어 지기 때문에 보기 싫 습 니 다.

  video{
   width: 100% !important;
   height: calc(100vh - 95px) !important; //          100vh-95px,                  
   object-fit:fill;  //      
  }
 }
 //      my_video   ,  video  div  (                      div),       
 #videoDiv>div{
  height: calc(100vh - 95px) !important;
  overflow: hidden;
 }
 .my_video{  //            
  width: 100%;
  height: calc(100vh - 95px);
  background-color: white;
 }
질문
video.js 플러그 인 은 vue 에서 vue-video-player 입 니 다.
우 리 는 vue 에서 영상 을 재생 할 때 이 플러그 인 을 사용 할 수 있 습 니 다.
다음은 몇 가지 사용 중의 문 제 를 간단하게 설명 하고 다른 문제 와 관련 되 지 않 습 니 다.
1.사용자 정의 재생 처리,우리 스스로 재생 이 벤트 를 실행 하 는 방법
2.재생,트리거 함수 에 대한 처 리 를 중단 합 니 다.
3.안 드 로 이 드 의 위 챗 에서 영상 을 재생 할 때 재생 할 수 없 는 문제;
1.사용자 정의 재생,지금 자신 이 button 을 썼 거나 다른 무언 가 를 동 영상 위 에 올 려 놓 았 다 고 가정 하고 이 게임 을 클릭 하여 동 영상 을 재생 하 라 고 요구 합 니 다.
재생 버튼 으로 도 이해 할 수 있 습 니 다.그러면 먼저 반드시 사건 을 연결 해 야 합 니 다.vue 바 인 딩 사건 은 말 하지 않 겠 습 니 다.다 할 수 있 을 것 입 니 다.그러면 이 바 인 딩 에 있 습 니 다.
이벤트 함수 에서 우 리 는 어떻게 동 영상 을 재생 합 니까?:this.$refs.videoPlayer.player.play(); 됐어 요.
2.재생 또는 재생 을 중단 할 때 추가 처 리 를 어떻게 하고 싶 습 니까?그러면
다음 코드 는 해당 함수 에서 처리 하면 되 고 다른 사건 도 비슷 하 게 처리 할 수 있 습 니 다.
3.에서 playsinline 인 자 를 설정 할 때 우리 가 true 또는 false 로 설정 하면 문제 가 발생 합 니 다.
따라서 상황 에 따라 처리 해 야 합 니 다.이곳 의 상황 은 보통 위 챗 브 라 우 저의 x5 커 널 입 니 다.false 로 설정 하고 다른 설정 은 true 로 설정 하면 됩 니 다.
만약 에 위 챗 의 x5 가 true 로 설정 되면 안 드 로 이 드 에서 위 챗 환경 에서 재생 할 수 없고 문제 가 있 습 니 다.
아래 코드 는 일부 코드 입 니 다.설정 만 참고 하 십시오.

<template>
  <div class="video">
    <video-player class="video-player-box"
         ref="videoPlayer"
         :options="playerOptions"
         :playsinline="playsinline"
         customEventName="customstatechangedeventname"
         @play="onPlayerPlay($event)"
         @pause="onPlayerPause($event)"
    >
    </video-player>
  </div>
</template> 
 
<script>
import 'video.js/dist/video-js.css'
import { videoPlayer } from 'vue-video-player'
 
export default {
  name: 'Video',
  props: {
    videoUrl: Object
  },
  data() {
    return{
      playerOptions: {
        playbackRates: [0.7, 1.0, 1.5, 2.0],
        autoplay: false,
        muted: false,
        loop: false,
        preload: 'auto', 
        language: 'zh-CN',
        aspectRatio: '16:9',
        fluid: true, 
        sources: [{
          type: "video/mp4",
          src: "https://cdn.theguardian.tv/webM/2015/07/20/150716YesMen_synd_768k_vp8.webm"
        }],
        poster: "http://localhost/547be638615da10.png",
        width: document.documentElement.clientWidth,
        notSupportedMessage: '        ,     ',
        controlBar: {
          timeDivider: true,
          durationDisplay: true,
          remainingTimeDisplay: false,
          fullscreenToggle: true //    
        }
      },
      videoButton: require("../video_player.png"),
    }
  },
  components: {
    videoPlayer
  },
  mounted() {
   
   this.playerOptions.sources[0].src = this.videoUrl.a;
   this.playerOptions.poster = this.videoUrl.b
  },
  computed: {
   player() {
    return this.$refs.videoPlayer.player
   },
 
   playsinline(){
    var ua = navigator.userAgent.toLocaleLowerCase();
    if (ua.match(/tencenttraveler/) != null || ua.match(/qqbrowse/) != null) {
      return false
    }else{
      return true       
    }
   }
 
  },
  methods: {
    clickStartButton: function(){
      this.$refs.videoPlayer.player.play();
    },
    onPlayerPlay(player) {
      this.videoPlayState = true;
    }
  }
}
</script>
이상 의 vue video 와 vue-video-player 가 영상 을 가득 채 우 는 튜 토리 얼 은 바로 편집장 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기