Как установить ключ и keyid для eme с помощью clear key?

Я хочу записать код eme для файла mp4 с зашифрованным открытым ключом. Сначала я подготовил зашифрованный mp4 следующим образом.

ffmpeg -i /path/to/file -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr -encryption_key 76a6c65c5ea762046bd749a2e632ccbb -encryption_kid a7e61c373e219033c21091fa607bf3b8 /path/to/output

Кроме того, я следовал за учебником для примера eme, и я также сослался на eme example2.
Итак, я записал как

var config = [{
  initDataTypes: ['cenc'],
  videoCapabilities: [{
    contentType: 'video/mp4; codecs="avc1.4d401f"'
  }]
}];

var KEY_ID = new Uint8Array([
  0xa7, 0xe6, 0x1c, 0x37, 0x3e, 0x21, 0x90, 0x33,
  0xc2, 0x10, 0x91, 0xfa, 0x60, 0x7b, 0xf3, 0xb8
]);

var KEY = new Uint8Array([
  0x76, 0xa6, 0xc6, 0x5c, 0x5e, 0xa7, 0x62, 0x04,
  0x6b, 0xd7, 0x49, 0xa2, 0xe6, 0x32, 0xcc, 0xbb
]);

function onLoad() {
  var video = document.querySelector('video');

  navigator.requestMediaKeySystemAccess('org.w3.clearkey', config).then(
    function(keySystemAccess) {
      console.log('keySystemAccess : ' + keySystemAccess);
      var promise = keySystemAccess.createMediaKeys();
      promise.then(
        function(createdMediaKeys) {
          console.log('CreatedMediaKeys : ' + createdMediaKeys);
          return video.setMediaKeys(createdMediaKeys);
        }
      ).catch(
        console.error.bind(console, "Unable to set Mediakeys")
      );
      promise.then(
        function(createdMediaKeys) {
          console.log(createdMediaKeys);
          console.log(toBase64(KEY_ID));
          var initData = {
            kids: [toBase64(KEY_ID)],
            "type": "temporary"
          };
          initData = new TextEncoder().encode(JSON.stringify(initData));
          var keySession = createdMediaKeys.createSession();
          keySession.addEventListener("message", handleMessage, false);
          return keySession.generateRequest("keyids", initData);
        }
      ).catch(
        console.error.bind(console, "Unable to generate Request")
      )
    }
  ).catch(
    console.error.bind(console, "Fail to initiazlie")
  );

  video.addEventListener('needkey', logEvent);
  video.addEventListener('webkitneedkey', logEvent);
  video.addEventListener('msneedkey', logEvent);

  video.addEventListener('webkitkeymessage', logEvent);
  video.addEventListener('webkitkeyerror', logEvent);
  video.addEventListener('webkitkeyadded', logEvent);
  video.addEventListener('keymessage', logEvent);
  video.addEventListener('keyerror', logEvent);
  video.addEventListener('keyadded', logEvent);

  video.addEventListener('error', function(evt){
    console.log('error:', evt);
    console.log(evt.target.error);
  }, false);
}

function handleMessage(event) {
  console.log('message event: ', event);
  console.log('key : ' + toBase64(KEY));
  var session = event.target;
  var keyObj = {
    kty: 'oct',
    kid: toBase64(KEY_ID),
    k: toBase64(KEY)
  };
  var license = new TextEncoder().encode(JSON.stringify({keys: [keyObj]}));
  session.update(license).catch(
    function(error) {
      console.error('Failed to update the session', error);
    }
  );
}

// Convert Uint8Array into base64 using base64url alphabet, without padding.
function toBase64(u8arr) {
  return btoa(String.fromCharCode.apply(null, u8arr)).
    replace(/\+/g, '-').replace(/\//g, '_').replace(/=*$/, '');
}

function logEvent(event){
  console.log('event: '+event.type);
}

Но когда я попробовал код выше, я обнаружил MediaError с кодом 3. Я предположил, что установил неправильное значение key или же keyid, Что я должен расшифровать это видео?

0 ответов

Другие вопросы по тегам