美文网首页
vue与阿里云点播插件集成实现上传视频和播放视频

vue与阿里云点播插件集成实现上传视频和播放视频

作者: 迷路小白兔 | 来源:发表于2019-07-06 15:24 被阅读0次

部署授权服务

目前客户端上传SDK支持两种授权方式:

整体步骤

1.请求上传地址加凭证或STS;
2.初始化上传实例,实例化上传有两种方式:上传地址加凭证和STS方式;
3.回调设置,所有的上传状态包括进度,上传成功,上传失败,凭证过期都在这里进行处理;
4.添加上传文件进入上传列表,目前主要支持视频文件和图片文件的上传;
5.启动上传;
6.回调处理;

实现

首先在index.html页面上引入下面三个JS脚本,视频上传SDK下载

    <script src="/lib/aliyun-upload-sdk/lib/es6-promise.min.js"></script>
    <script src="/lib/aliyun-upload-sdk/lib/aliyun-oss-sdk-5.3.1.min.js"></script>
    <script src="/lib/aliyun-upload-sdk/aliyun-upload-sdk-1.5.0.min.js"></script>

因为项目需要的只是一个简单的上传功能,不需要用户自己输入过期时间、重新上传间隔时间等等、所以都用了默认值,只需要直接上传就可以了,需要自定义更多可以查看JavaScript上传SDK文档,html代码:

        <div>
          <input type="file" id="fileUpload" @change="fileChange($event)" />
          <label class="status">
            上传状态:
            <span>{{statusText}}</span>
          </label>
        </div>
        <div class="upload-type">
          <button @click="authUpload" :disabled="uploadDisabled">开始上传</button>
          <button @click="pauseUpload" :disabled="pauseDisabled">暂停</button>
          <button :disabled="resumeDisabled" @click="resumeUpload">恢复上传</button>
          <span class="progress">
            上传进度:
            <i id="auth-progress">{{authProgress}}</i> %
          </span>
        </div>

JS代码:

   fileChange(e) {
      this.file = e.target.files[0];
      if (!this.file) {
        alert("请先选择需要上传的文件!");
        return;
      }
      var Title = this.file.name;
      var userData = '{"Vod":{}}';
      if (this.uploader) {
        this.uploader.stopUpload();
        this.authProgress = 0;
        this.statusText = "";
      }
      this.uploader = this.createUploader();
      this.uploader.addFile(this.file, null, null, null, userData);
      this.uploadDisabled = false;
      this.pauseDisabled = true;
      this.resumeDisabled = true;
    },
    authUpload() {
      // 然后调用 startUpload 方法, 开始上传
      if (this.title == "") {
        this.$message.error("视频标题不能为空");
        this.uploadDisabled = false;
        this.pauseDisabled = true;
        this.resumeDisabled = true;
        return;
      }
      if (this.uploader !== null) {
        this.uploader.startUpload();
        this.uploadDisabled = true;
        this.pauseDisabled = false;
      }
    },
    // 暂停上传
    pauseUpload() {
      if (this.uploader !== null) {
        this.uploader.stopUpload();
        this.resumeDisabled = false;
        this.pauseDisabled = true;
      }
    },
    // 恢复上传
    resumeUpload() {
      if (this.uploader !== null) {
        this.uploader.startUpload();
        this.resumeDisabled = true;
        this.pauseDisabled = false;
      }
    },
    createUploader(type) {
      let self = this;
      let uploader = new AliyunUpload.Vod({
        timeout: 60000,
        partSize: 1048576,
        parallel: 5,
        retryCount: 3,
        retryDuration: 2,
        region: self.region,
        userId: self.userId,
        // 添加文件成功
        addFileSuccess: function(uploadInfo) {
          self.uploadDisabled = false;
          self.resumeDisabled = false;
          self.statusText = "添加文件成功, 等待上传...";
          console.log("addFileSuccess: " + uploadInfo.file.name);
        },
        // 开始上传
        onUploadstarted: function(uploadInfo) {
          // 如果是 UploadAuth 上传方式, 需要调用 uploader.setUploadAuthAndAddress 方法
          // 如果是 UploadAuth 上传方式, 需要根据 uploadInfo.videoId是否有值,调用点播的不同接口获取uploadauth和uploadAddress
          // 如果 uploadInfo.videoId 有值,调用刷新视频上传凭证接口,否则调用创建视频上传凭证接口
          // 注意: 这里是测试 demo 所以直接调用了获取 UploadAuth 的测试接口, 用户在使用时需要判断 uploadInfo.videoId 存在与否从而调用 openApi
          // 如果 uploadInfo.videoId 存在, 调用 刷新视频上传凭证接口(https://help.aliyun.com/document_detail/55408.html)
          // 如果 uploadInfo.videoId 不存在,调用 获取视频上传地址和凭证接口(https://help.aliyun.com/document_detail/55407.html)

          if (!uploadInfo.videoId) {
            self.$axios
              .post("/api/project/video/gettoken", {
                title: self.title,
                filename: uploadInfo.file.name,
                template: "ProjectVideoWatermark",
                userdescription: self.userdescription,
                project_id: 1
              })
              .then(({ data }) => {
                if (data.code == 0) {
                  let uploadAuth = data.data.UploadAuth;
                  let uploadAddress = data.data.UploadAddress;
                  let videoId = data.data.VideoId;
                  uploader.setUploadAuthAndAddress(
                    uploadInfo,
                    uploadAuth,
                    uploadAddress,
                    videoId
                  );
                }
              });
            self.statusText = "文件开始上传...";
            console.log(
              "onUploadStarted:" +
                uploadInfo.file.name +
                ", endpoint:" +
                uploadInfo.endpoint +
                ", bucket:" +
                uploadInfo.bucket +
                ", object:" +
                uploadInfo.object
            );
          } else {
            // 如果videoId有值,根据videoId刷新上传凭证
            let refreshUrl =
              "/api/project/video/refreshtoken?VideoID=" + uploadInfo.videoId;
            self.$axios.get(refreshUrl).then(({ data }) => {
              console.log(data);
              if (data.code == 0) {
                let uploadAuth = data.data.UploadAuth;
                let uploadAddress = data.data.UploadAddress;
                let videoId = data.data.VideoId;
                uploader.setUploadAuthAndAddress(
                  uploadInfo,
                  uploadAuth,
                  uploadAddress,
                  videoId
                );
              }
            });
          }
        },
        // 文件上传成功
        onUploadSucceed: function(uploadInfo) {
          console.log(
            "onUploadSucceed: " +
              uploadInfo.file.name +
              ", endpoint:" +
              uploadInfo.endpoint +
              ", bucket:" +
              uploadInfo.bucket +
              ", object:" +
              uploadInfo.object
          );
          self.statusText = "文件上传成功!";
        },
        // 文件上传失败
        onUploadFailed: function(uploadInfo, code, message) {
          console.log(
            "onUploadFailed: file:" +
              uploadInfo.file.name +
              ",code:" +
              code +
              ", message:" +
              message
          );
          self.statusText = "文件上传失败!";
        },
        // 取消文件上传
        onUploadCanceled: function(uploadInfo, code, message) {
          console.log(
            "Canceled file: " +
              uploadInfo.file.name +
              ", code: " +
              code +
              ", message:" +
              message
          );
          self.statusText = "文件已暂停上传";
        },
        // 文件上传进度,单位:字节, 可以在这个函数中拿到上传进度并显示在页面上
        onUploadProgress: function(uploadInfo, totalSize, progress) {
          console.log(
            "onUploadProgress:file:" +
              uploadInfo.file.name +
              ", fileSize:" +
              totalSize +
              ", percent:" +
              Math.ceil(progress * 100) +
              "%"
          );
          let progressPercent = Math.ceil(progress * 100);
          self.authProgress = progressPercent;
          self.statusText = "文件上传中...";
        },
        // 上传凭证超时
        onUploadTokenExpired: function(uploadInfo) {
          let refreshUrl =
            "/api/project/video/refreshtoken?VideoID=" + uploadInfo.videoId;
          this.$axios.get(refreshUrl).then(({ data }) => {
            let uploadAuth = data.UploadAuth;
            uploader.resumeUploadWithAuth(uploadAuth);
            console.log(
              "upload expired and resume upload with uploadauth " + uploadAuth
            );
          });
          self.statusText = "文件超时...";
        },
        // 全部文件上传结束
        onUploadEnd: function(uploadInfo) {
          console.log("onUploadEnd: uploaded all the files");
          self.statusText = "文件上传完毕";
        }
      });
      return uploader;
    }

播放视频就很简单了,参考官方代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="IE=edge" >
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/>
<title>Aliplayer Online Settings</title>
<link rel="stylesheet" href="https://g.alicdn.com/de/prismplayer/2.8.2/skins/default/aliplayer-min.css" />
<script type="text/javascript" charset="utf-8" src="https://g.alicdn.com/de/prismplayer/2.8.2/aliplayer-min.js"></script>
</head>
<body>
<div class="prism-player" id="player-con"></div>
<script>
var player = new Aliplayer({
  "id": "player-con",
  "source": "//player.alicdn.com/video/aliyunmedia.mp4",
  "width": "100%",
  "height": "500px",
  "autoplay": true,
  "isLive": false,
  "rePlay": false,
  "playsinline": true,
  "preload": true,
  "controlBarVisibility": "hover",
  "useH5Prism": true
}, function (player) {
    console.log("The player is created");
  }
);
</script>
</body>

相关文章

网友评论

      本文标题:vue与阿里云点播插件集成实现上传视频和播放视频

      本文链接:https://www.haomeiwen.com/subject/nnvphctx.html