vue video全屏播放

需求:

1、视频为长方形,页面初始化打开为横屏全屏播放视频。

2、微信不支持自动播放,故自动播放需求删除。

方法:

1、vue-video-player插件

因需求较简单,仅要求播放本地一个视频,故未选择使用插件。

2、video

<div id="video_box" style="z-index: 999;" :class="{video_box_rotate: isIos}">
                <video
                    @click="videoPlay"
                    class="index_video"
                    poster="../assets/images/poster.jpg"
                    id="video_content"
            style="object-fit:fill"  /*加这个style会让 Android / web 的视频在微信里的视频全屏,如果是在手机上预览,会让视频的封面同视频一样大小
                    webkit-playsinline='true'
                    playsinline="true"
                    x5-playsinline="true"
                    x-webkit-airplay="true"
                    x5-video-player-type="h5"
                    x5-video-player-fullscreen="true" /*全屏播放*/
                    x5-video-ignore-metadata="true"
                    x5-video-orientation="landscape" /*播放器的方向,landscape横屏,portraint竖屏,默认值为竖屏*/
           preload="preload"> <source src="../../static/video.mp4" type='video/mp4; codecs="avc1.4D401E, mp4a.40.2"' > </video> </div>

具体属性解释可参考 https://blog.csdn.net/qq_16494241/article/details/62046891

同层H5播放器官网 https://x5.tencent.com/tbs/guide/video.html

注意:

x5-video-orientation="landscape" /*播放器支付的方向,landscape横屏,portraint竖屏,默认值为竖屏*/
landscape属性ios不支持
为兼容ios横屏将视频旋转90度
mounted() {
        if (是否为ios) {
            this.videoFullScreen();
        }
    }
methods: {
    // 视频宽高设置为手机宽高 videoFullScreen() { let width = document.documentElement.clientWidth; let height = document.documentElement.clientHeight; document.getElementById('video_content').style.height = width + 'px'; document.getElementById('video_content').style.width = height + 'px'; }, }
/*视频旋转*/
.video_box_rotate{
   transform rotate(90deg) }

视频监听播放结束、进入全屏、退出全屏事件

mounted() {this.videoEnd()},
methods: {
    videoEnd(){

      let video = document.getElementById(‘video_content’);      video.addEventListener(‘ended’, () => {        alert(‘video end’)      });


  }; // 视频播放结束 }
// 全屏事件 x5videoenterfullscreen
// 退出全屏 x5videoexitfullscreen

监听手机横竖屏

window.addEventListener('orientationchange', function() {
                    // alert(window.orientation); // 这里可以根据orientation做相应的处理
                    if (window.orientation === -90) {
                        self.iphoneScreenShow = true;
                    } else {
                        self.iphoneScreenShow = false;
                    }
                }, false);

视频初始化黑屏
可以在视频上加个div浮层(可以一个假的视频第一帧),然后用timeupdate方法监听,视屏播放及有画面的时候再移除浮层。https://segmentfault.com/a/1190000009395289
视频进入全屏,退出全屏监听
https://segmentfault.com/a/1190000013232870
监听视频播放完成
https://blog.csdn.net/mondy592/article/details/81219167

参考资料 https://blog.csdn.net/xcy1193068639/article/details/80242111#commentsedit

安卓去掉控制按钮 参考http://www.xyhtml5.com/3252.html

欢迎大家指点,谢谢

转载于:https://www.cnblogs.com/1032473245jing/p/10222448.html

在vue中写一段自适应屏幕代码,并在移动端判断横竖屏

在这里插入图片描述
在这里插入图片描述

效果如下:
1.自适应

2.判断移动端横竖屏

只需在app.vue中写入如下代码

<template>
  <div id="app">
    // 注意! src的图片自己找一张gif图
    <div class="app-hint"
         v-if="isScreen"><img src="./assets/image/screen.gif"
           alt=""></div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      screenWidth: document.body.clientWidth, // 网页可见区域宽
      screenHW: window.orientation, // 判断横竖屏
      isScreen: false // 横竖屏
    };
  },
  watch: {
    screenWidth(val) {
      // 为了避免频繁触发resize函数导致页面卡顿,使用定时器
      if (!this.timer) {
        // 一旦监听到的screenWidth值改变,就将其重新赋给data里的screenWidth
        this.screenWidth = val;
        this.timer = true;
        let that = this;
        setTimeout(function() {
          // 执行自适应代码
          that.bodyScale()
          // 打印screenWidth变化的值
          console.log(that.screenWidth);
          that.timer = false;
        }, 400);
      }
    },
    screenHW () {
      this.rotate()
    }
  },
  methods: {
    // 自适应代码
    bodyScale() {
      var devicewidth = document.documentElement.clientWidth; //获取当前分辨率下的可是区域宽度
      var scale = devicewidth / 1960; // 分母——设计稿的尺寸
      document.body.style.zoom = scale; //放大缩小相应倍数
    },
     // 判断横竖屏
    rotate () {
      if (this.screenHW == 180 || this.screenHW == 0) {
        console.log('竖屏')
        this.isScreen = true
      } else if (this.screenHW == 90 || this.screenHW == -90) {
        console.log('横屏')
        this.isScreen = false
      }
    }
  },
  created() {
    // 执行自适应代码
    this.bodyScale()
  },
  mounted () {
    // 监听窗口大小
    window.onresize = () => {
      return (() => {
        this.screenWidth = document.body.clientWidth;
        // 把横竖屏的变化赋值
        that.screenHW = window.orientation
      })()
    }
  }
};
</script>

vue 调用微信支付方法

pay(){let data ={  order_id:this.order_id,  wechatpay_type:this.wechatpay_type,  merchant_id:localStorage.merchant_id,  authentication_token:this.token,  client_token:this.client_token}
this.$fetch(this.Wxpay, data).then(res=>{  if(res.code==200){    if (res.data.wechatpay_type == “wxpay”) {    // 公众号支付    this.callWxPay(res.data.pay_param);  } else if (res.data.wechatpay_type == “wxpay_h5_wap”) {    this.callWxPayH5(res.data.pay_param.mweb_url);  } else if (res.data.wechatpay_type == “wxpay_app”) {    this.callWxPayAPP(res.data.pay_param);  } else {    Toast(‘无效的支付类型’);  }  }else{    Toast(res.error)  }  },err=>{    alert(JSON.stringify(err))  })}, jsApiCall(params) {  let that = this  WeixinJSBridge.invoke(    ’getBrandWCPayRequest’, {      ’appId’: params.appId,      ’timeStamp’:params.timeStamp,      ’nonceStr’: params.nonceStr,      ’package’: params.package,      ’signType’: params.signType,      ’paySign’: params.paySign    },    function (res) {      if (res.err_msg === ‘get_brand_wcpay_request:ok’) {        Toast(‘微信支付成功’)        that.$router.replace({name:’fullOrder’,query:{id:’2′}})      } else if (res.err_msg === ‘get_brand_wcpay_request:cancel’) {        Toast(‘用户取消支付’)        that.$router.replace({name:’fullOrder’,query:{id:’1′}})      } else if (res.err_msg === ‘get_brand_wcpay_request:fail’) {        Toast(‘网络异常,请重试’)      }    }  );}, callWxPay(params) {  if (typeof WeixinJSBridge == “undefined”){  if( document.addEventListener ){    document.addEventListener(‘WeixinJSBridgeReady’, this.jsApiCall(params), false);  }else if (document.attachEvent){    document.attachEvent(‘WeixinJSBridgeReady’, this.jsApiCall(params));    document.attachEvent(‘onWeixinJSBridgeReady’, this.jsApiCall(params));    }  }else{    this.jsApiCall(params);  }}, callWxPayH5(mweb_url) {  location.href = mweb_url;}, callWxPayAPP(params) {  let dsBridge = require(“dsbridge”);  dsBridge.call(“requestWeChatPay”, params, function (data) {    alert(data);  })}, wechatpaytype(){  if(this.isWeiXin()){    this.wechatpay_type=’wxpay’  }else{    this.wechatpay_type=’wxpay_h5_wap’  }}, isWeiXin(){    //判断是否微信平台  var ua = window.navigator.userAgent.toLowerCase();    if (ua.match(/MicroMessenger/i) == ‘micromessenger’){    return true;  } else {    return false;  }}

https://www.cnblogs.com/ruthless/p/9009235.html

vue移动端使用appClound拉起支付宝支付的实现方法

vue移动端使用appClound拉起支付宝支付的实现方法_vue.js_脚本之家 这篇文章主要介绍了vue移动端使用appClound拉起支付宝支付的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

web

1-首先在config.xml中进行配置?

123<feature name="aliPay"><param name="urlScheme" value="AliPayA000000000" /></feature>

<feature name=”aliPay”> <param name=”urlScheme” value=”AliPayA000000000″ /> </feature>

2-在自己的应用中添加支付宝支付的模块

3.使用支付宝模块进行拉起支付宝?

1234567891011121314if (res.data.code == 200) {// 拉起支付宝//开发者通过 payOrder 方法来进行支付,自己处理订单信息以及签名过程console.log("自己处理订单信息以及签名过程请求:");var aliPay = api.require('aliPay');aliPay.payOrder({orderInfo: 'alipay_sdk=alipay-sdk-php-20180705&app_id=2016051201393416&biz_content=%........'}, function (ret, err) {api.alert({title: '支付结果',msg: ret.code,buttons: ['确定']});});

if (res.data.code == 200) { // 拉起支付宝 //开发者通过 payOrder 方法来进行支付,自己处理订单信息以及签名过程 console.log(“自己处理订单信息以及签名过程请求:”); var aliPay = api.require(‘aliPay’); aliPay.payOrder({ orderInfo: ‘alipay_sdk=alipay-sdk-php-20180705&app_id=2016051201393416&biz_content=%……..’ }, function (ret, err) { api.alert({ title: ‘支付结果’, msg: ret.code, buttons: [‘确定’] }); });

具体可以参考官网的 : https://docs.apicloud.com/Client-API/Open-SDK/aliPay

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

VUE 上传视频 获取视频时长 带上传进度条 实例详解

在这里插入图片描述


如同所示,实现上传视频的功能:

HTML部分

//element-ui提供的上传组件el-upload
<el-upload
  class="avatar-uploader el-upload--text"
  action="#"
  :show-file-list="false"
  :before-upload="beforeUploadVideo"
>
  <video
    v-if="form.tryVideo !='' && videoFlag == false"
    style="width:300px; height:auto;"
    :src="form.tryVideo"
    class="avatar"
    controls="controls"
  >您的浏览器不支持视频播放</video>
  <div class="add-video" v-else-if="form.tryVideo =='' && videoFlag == false">
    <i class="el-icon-plus avatar-uploader-icon"></i>
  </div>
  <el-progress
    v-if="videoFlag == true"
    type="circle"
    :percentage="videoUploadPercent"
    style="margin-top:30px;"
  ></el-progress>
</el-upload>

JS部分


data() {
	return {
		form: { 
		tryVideo: "",
		tryVideoImg: "", 
		},
		videoFlag: false, //是否显示进度条
		videoUploadPercent: 0, //进度条的进度,
		duration: "", //视频时长
	}
}

//方法
methods: {
	//上传视频格式限制
	beforeUploadVideo(file) {
	  if (
	    [
	      "video/mp4",
	      "video/ogg",
	      "video/flv",
	      "video/avi",
	      "video/wmv",
	      "video/rmvb"
	    ].indexOf(file.type) == -1
	  ) {
	    this.$message.error("请上传正确的视频格式");
	    return false;
	  }
	  //获取视频时长
	  let videoUrl = URL.createObjectURL(file);
	  let audioElement = new Audio(videoUrl);
	  audioElement.addEventListener("loadedmetadata", () => {
	    let duration = audioElement.duration; //时长为秒,小数,182.36
	    if (duration > 16) {
	      this.$message.error("提示,上传视频时长不能超过15秒");
	      return false;
	    }
	    this.addVideo(file);
	  });
	  return false;
	},
	//上传视频接口
	addVideo(file) {
	  //设置formData
	  let formData = new FormData();
	  formData.append("file", file);
	  //在请求头设置上传进度条
	  let config = {
	    onUploadProgress: progressEvent => {
	      var complete =
	        ((progressEvent.loaded / progressEvent.total) * 100) | 0;
	      this.videoUploadPercent = complete;
	    },
	    headers: {
	      "Content-Type": "multipart/form-data"
	    }
	  };
	  this.videoFlag = true;
	  //调用后端上传视频的接口
	  dodoApi.uploadMp4(formData, config).then(res => {
	    this.videoFlag = false;
	    if (res && res.code == 0) {
	      this.form.tryVideo = res.data.picUrl;//视频地址
	      this.form.tryVideoImg = res.data.smallPicUrl;//视频封面
	    } else {
	      this.$message.error(res.message || "网络出了小差");
	    }
	  });
	  return false;
	},
}

大功告成

在这里插入图片描述
在这里插入图片描述

最后,给大家看看我上传视频的传参格式

vue 上传视频和图片 并且截取视频第一帧作为播放前默认图片

 <el-upload
                :action="pathUrl+'/api/FileUpload/SaveFiles'"
                :limit="5"
                list-type="picture-card"
                :file-list="sfzzm"
                :on-preview="handlePictureCardPreview"
                :on-success="handleDownload"
                :on-remove="handleRemove"
                :on-exceed="handleExceed"
                :before-upload="beforeAvatarUpload"
              >
                <i class="el-icon-plus"></i>
              </el-upload>
              <el-dialog :visible.sync="dialogVisible">
                <img width="100%" :src="dialogImageUrl" alt />
              </el-dialog>
 handleDownload(response, file, fileList) {
if (file.status) {
var index = file.name.indexOf("."); //(考虑严谨用lastIndexOf(".")得到)得到"."在第几位
var tv_id = file.name.substring(index); //截断"."之前的,得到后缀
this.videoUrl = file.url;
//如果是视频截取第一个作为图片展示出来
if (tv_id == ".mp4") {
//根据后缀,判断是否符合视频格式
this.findvideocover(this.pathUrl+response.Data[0],file);
}
this.sfzzm.push(file);
this.ListFileUrlDetail.Url = response.Data[0];
this.ListFileUrlDetail.Size = file.size;
this.ListFileUrlDetail.uid = file.uid;
 
this.form.FileUrls.push( Object.assign({}, this.ListFileUrlDetail) );
}
console.log("sfzzm" + JSON.stringify(this.sfzzm));
},
 
///超出数量限制
handleExceed(files, fileList) {
this.$message.warning(
`当前限制选择 5 个文件,本次选择了 ${
files.length
} 个文件,共选择了 ${files.length + fileList.length} 个文件`
);
}, 
 //截取视频第一帧作为播放前默认图片      findvideocover(url,file) {         const  video = document.getElementById("upvideo"); // 获取视频对象         // const video = document.createElement("video") // 也可以自己创建video          video.src=url // url地址 url跟 视频流是一样的         var canvas = document.getElementById('mycanvas') // 获取 canvas 对象         const ctx = canvas.getContext('2d'); // 绘制2d         video.crossOrigin = 'anonymous' // 解决跨域问题,也就是提示污染资源无法转换视频         video.currentTime = 1 // 第一帧         video.oncanplay = () => {           canvas.width = video.clientWidth; // 获取视频宽度         canvas.height = video.clientHeight; //获取视频高度         // 利用canvas对象方法绘图         ctx.drawImage(video, 0, 0, video.clientWidth,video.clientHeight)         // 转换成base64形式          this.imgsrc = canvas.toDataURL ("image/png") // 截取后的视频封面          file.url=this.imgsrc;       }     }, 

基于vue的实时视频流开发

背景:多个实时视频的介入

技术:hls.js的流媒体,支持格式已m3u8为主

解决了什么:多个实时视频长时间播放会有卡顿的情况

具体代码实现:

import Hls from 'hls.js'

  playVideo(id) {

      let  hls = new Hls();
      const _this = this
      let video = $("#camera-video")[0]
        if(Hls.isSupported()) {//查看浏览器是否支持
          hls.loadSource(this.videoSrc);//输入视频源
          hls.attachMedia(video);//添加到视频标签里
          hls.on(Hls.Events.MANIFEST_PARSED,function() {
            video.play();
          });
      this.hlsObj=hls;  }else if (video.canPlayType('application/vnd.apple.mpegurl')) { video.src = this.videoSrc; video.addEventListener('loadedmetadata',function() { video.play(); }); } },
销毁视频
destoryVideo() {
      this.$refs.cameraVideo.pause();
      this.hlsObj.destroy();
      this.hlsObj = null;
    }