Как установить ключ и 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
, Что я должен расшифровать это видео?