1. 程式人生 > 其它 >H5播放需要解密的m3u8音訊檔案

H5播放需要解密的m3u8音訊檔案

<audio ref="audio"></audio>
import CryptoJS from "crypto-js";
import Hls from 'hls.js';
methods:{
getHls (url) {
      if (Hls.isSupported()) {
        var hls = new Hls();
        var _gthis = this;
        hls.attachMedia(this.$refs.audio);
        hls.on(Hls.Events.MEDIA_ATTACHED, function () {
          // console.log('audio and hls.js are now bound together !');
          hls.loadSource(url);
          hls.on(Hls.Events.KEY_LOADED, function (event, data) {
            const { frag } = data
            // console.log(frag);
            // debugger
            var _ts = ["ts列表資料1",
                "ts列表資料2",
                "ts列表資料3",
                "ts列表資料4",
                "ts列表資料5"];
            var query = frag._decryptdata._uri;
            var ts = _gthis.getQueryVariable(query, 'ts');
            // console.log(ts, frag._decryptdata.key)
            // debugger
            if (ts) {
              var _ = _gthis.getQueryVariable(query, '_');
              // console.log(_gthis.decrypt(_, _ts[ts]))
              frag._decryptdata.key = _gthis.stringToUint8Array(_gthis.decrypt(_, _ts[ts]))
              // console.log(frag._decryptdata.key)
              _gthis.$refs.audio.play();
            }
          })
        });
      } else if (this.$refs.audio.canPlayType('application/vnd.apple.mpegurl')) {
        this.$refs.audio.src = url
        let that = this
        this.$refs.audio.addEventListener('loadedmetadata', function () {
          that.$refs.audio.play();
        });
      }
    },    
  stringToUint8Array (str) {
      var arr = [];
      for (var i = 0, j = str.length; i < j; ++i) {
        arr.push(str.charCodeAt(i));
      }
      var tmpUint8Array = new Uint8Array(arr);
      return tmpUint8Array
    },
    getQueryVariable (query, variable) {
      return decodeURIComponent((new RegExp('[?|&]' + variable + '=' + '([^&;]+?)(&|#|;|$)').exec(query) || [, ""])[1]) || null
    },
    decrypt (word, keyStr) {
      var key = CryptoJS.enc.Utf8.parse(keyStr);
      var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
      return CryptoJS.enc.Utf8.stringify(decrypt).toString();
    }
},
mounted(){
    this.getHls('https://s.music.com/m/90b416a4faff0e6/000_00000.m3u8')
}