vue與阿里云點(diǎn)播插件集成實(shí)現(xiàn)上傳視頻和播放視頻

部署授權(quán)服務(wù)

目前客戶端上傳SDK支持兩種授權(quán)方式:

整體步驟

1.請(qǐng)求上傳地址加憑證或STS涂滴;
2.初始化上傳實(shí)例羔沙,實(shí)例化上傳有兩種方式:上傳地址加憑證和STS方式钉凌;
3.回調(diào)設(shè)置建钥,所有的上傳狀態(tài)包括進(jìn)度专筷,上傳成功糖埋,上傳失敗忿项,憑證過(guò)期都在這里進(jìn)行處理闷旧;
4.添加上傳文件進(jìn)入上傳列表长豁,目前主要支持視頻文件和圖片文件的上傳;
5.啟動(dòng)上傳忙灼;
6.回調(diào)處理蕉斜;

實(shí)現(xiàn)

首先在index.html頁(yè)面上引入下面三個(gè)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>

因?yàn)轫?xiàng)目需要的只是一個(gè)簡(jiǎn)單的上傳功能宅此,不需要用戶自己輸入過(guò)期時(shí)間、重新上傳間隔時(shí)間等等爬范、所以都用了默認(rèn)值父腕,只需要直接上傳就可以了,需要自定義更多可以查看JavaScript上傳SDK文檔,html代碼:

        <div>
          <input type="file" id="fileUpload" @change="fileChange($event)" />
          <label class="status">
            上傳狀態(tài):
            <span>{{statusText}}</span>
          </label>
        </div>
        <div class="upload-type">
          <button @click="authUpload" :disabled="uploadDisabled">開(kāi)始上傳</button>
          <button @click="pauseUpload" :disabled="pauseDisabled">暫停</button>
          <button :disabled="resumeDisabled" @click="resumeUpload">恢復(fù)上傳</button>
          <span class="progress">
            上傳進(jìn)度:
            <i id="auth-progress">{{authProgress}}</i> %
          </span>
        </div>

JS代碼:

   fileChange(e) {
      this.file = e.target.files[0];
      if (!this.file) {
        alert("請(qǐng)先選擇需要上傳的文件!");
        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() {
      // 然后調(diào)用 startUpload 方法, 開(kāi)始上傳
      if (this.title == "") {
        this.$message.error("視頻標(biāo)題不能為空");
        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;
      }
    },
    // 恢復(fù)上傳
    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);
        },
        // 開(kāi)始上傳
        onUploadstarted: function(uploadInfo) {
          // 如果是 UploadAuth 上傳方式, 需要調(diào)用 uploader.setUploadAuthAndAddress 方法
          // 如果是 UploadAuth 上傳方式, 需要根據(jù) uploadInfo.videoId是否有值青瀑,調(diào)用點(diǎn)播的不同接口獲取uploadauth和uploadAddress
          // 如果 uploadInfo.videoId 有值璧亮,調(diào)用刷新視頻上傳憑證接口,否則調(diào)用創(chuàng)建視頻上傳憑證接口
          // 注意: 這里是測(cè)試 demo 所以直接調(diào)用了獲取 UploadAuth 的測(cè)試接口, 用戶在使用時(shí)需要判斷 uploadInfo.videoId 存在與否從而調(diào)用 openApi
          // 如果 uploadInfo.videoId 存在, 調(diào)用 刷新視頻上傳憑證接口(https://help.aliyun.com/document_detail/55408.html)
          // 如果 uploadInfo.videoId 不存在,調(diào)用 獲取視頻上傳地址和憑證接口(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 = "文件開(kāi)始上傳...";
            console.log(
              "onUploadStarted:" +
                uploadInfo.file.name +
                ", endpoint:" +
                uploadInfo.endpoint +
                ", bucket:" +
                uploadInfo.bucket +
                ", object:" +
                uploadInfo.object
            );
          } else {
            // 如果videoId有值斥难,根據(jù)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 = "文件已暫停上傳";
        },
        // 文件上傳進(jìn)度枝嘶,單位:字節(jié), 可以在這個(gè)函數(shù)中拿到上傳進(jìn)度并顯示在頁(yè)面上
        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 = "文件上傳中...";
        },
        // 上傳憑證超時(shí)
        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 = "文件超時(shí)...";
        },
        // 全部文件上傳結(jié)束
        onUploadEnd: function(uploadInfo) {
          console.log("onUploadEnd: uploaded all the files");
          self.statusText = "文件上傳完畢";
        }
      });
      return uploader;
    }

播放視頻就很簡(jiǎn)單了,參考官方代碼:

<!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"  />
<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": "http://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>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哑诊,一起剝皮案震驚了整個(gè)濱河市群扶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖竞阐,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缴饭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡骆莹,警方通過(guò)查閱死者的電腦和手機(jī)颗搂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)幕垦,“玉大人丢氢,你說(shuō)我怎么就攤上這事∠雀模” “怎么了疚察?”我有些...
    開(kāi)封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盏道。 經(jīng)常有香客問(wèn)我稍浆,道長(zhǎng)载碌,這世上最難降的妖魔是什么猜嘱? 我笑而不...
    開(kāi)封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮嫁艇,結(jié)果婚禮上朗伶,老公的妹妹穿的比我還像新娘。我一直安慰自己步咪,他們只是感情好论皆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著猾漫,像睡著了一般点晴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悯周,一...
    開(kāi)封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天粒督,我揣著相機(jī)與錄音,去河邊找鬼禽翼。 笑死屠橄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闰挡。 我是一名探鬼主播锐墙,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼长酗!你這毒婦竟也來(lái)了溪北?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刻盐,沒(méi)想到半個(gè)月后掏膏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敦锌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年馒疹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乙墙。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颖变,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出听想,到底是詐尸還是另有隱情腥刹,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布汉买,位于F島的核電站衔峰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛙粘。R本人自食惡果不足惜垫卤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望出牧。 院中可真熱鬧穴肘,春花似錦、人聲如沸舔痕。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伯复。三九已至慨代,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啸如,已是汗流浹背侍匙。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留组底,地道東北人丈积。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像债鸡,于是被迫代替她去往敵國(guó)和親江滨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容