diff --git a/src/key.js b/src/key.js new file mode 100644 index 000000000..d2faaa4e5 --- /dev/null +++ b/src/key.js @@ -0,0 +1,33 @@ +/** + * @file key.js + * + * + * Store the unique key for the video data; + * @type {Object} + * @private + */ + +let keyObject = {}; + +/** + * Test if wo have stored the key + * + * @param {String} The uri of the key which we need to load; + * @return {Boolean} do we have stored the key which we want to load; + * @function getStoredKey + */ +export function getStoredKey(uri) { + if (keyObject[uri]) { + return keyObject[uri]; + } + return false; +} + +/** + * Store the key and uri + * @param {String} uri The uri of the key + * @param {Unit32Array} key The data of key in Uint32Array Typed Array + */ +export function setStoredKey(uri, key) { + keyObject[uri] = key; +} diff --git a/src/segment-loader.js b/src/segment-loader.js index dd2dd88c6..5446ec6a9 100644 --- a/src/segment-loader.js +++ b/src/segment-loader.js @@ -9,6 +9,7 @@ import {Decrypter} from 'aes-decrypter'; import mp4probe from 'mux.js/lib/mp4/probe'; import Config from './config'; import window from 'global/window'; +import {getStoredKey,setStoredKey} from './key'; // in ms const CHECK_BUFFER_DELAY = 500; @@ -615,12 +616,17 @@ export default class SegmentLoader extends videojs.EventTarget { // optionally, request the decryption key if (segment.key) { - let keyRequestOptions = videojs.mergeOptions(this.xhrOptions_, { - uri: segment.key.resolvedUri, - responseType: 'arraybuffer' - }); + let bytes = getStoredKey(segment.key.uri); + if( bytes ){ + segment.key.bytes = bytes; + }else{ + let keyRequestOptions = videojs.mergeOptions(this.xhrOptions_, { + uri: segment.key.resolvedUri, + responseType: 'arraybuffer' + }); - keyXhr = this.hls_.xhr(keyRequestOptions, this.handleResponse_.bind(this)); + keyXhr = this.hls_.xhr(keyRequestOptions, this.handleResponse_.bind(this)); + } } // optionally, request the associated media init segment @@ -773,6 +779,8 @@ export default class SegmentLoader extends videojs.EventTarget { view.getUint32(12) ]); + setStoredKey(segment.key.uri,segment.key.bytes); + // if the media sequence is greater than 2^32, the IV will be incorrect // assuming 10s segments, that would be about 1300 years segment.key.iv = segment.key.iv || new Uint32Array([