少し前に、ハブでW3Cの新しいイニシアチブである
Encrypted Media ExtensionsまたはEMEのみが議論されました。 私たちにとって、何が新しくて面白いかを実際に理解してみましょう。
だから、タスク:インターネットに載せたい面白いビデオ素材がたくさんあるが、みんなのためではなく
、善良な人々のためだけ
に (友人、知人、...、またはお金のために)あるとします。 そのため、Encrypted Media Extensionsイニシアチブでは、クライアント部分に必要なすべてのAPIをHTML標準に追加することを提案しています。 さらに、W3Cの提案は、不運なDRMなどの他の問題にも対処していますが、仮想サービス組織のクライアント側のみに焦点を当てて、現時点では延期します。 前提条件は、ブラウザーがEME仕様をサポートしていることです。つまり、基本的なクリアキー
システムもサポートされています。
そのため、
video
タグと
foo.webm
ファイルがあり、AESアルゴリズムを使用してビデオとオーディオが暗号化されます(この機能はWebM
コンテナーでサポートされ、EME作成者はこれを利用しました)。
<video src="foo.webm" autoplay></video>
この状況で、
foo.webm
を再生しようとすると、EMEブラウザーはコンテンツが暗号化されていることを検出し、停止して復号化キーが与えられるのを待ちます。 一般に、主な使用例は、コンテンツがどのように暗号化されるかに関する情報がコンテナに直接記述されることです。 このオプションを使用します。 ブラウザを停止することに加えて、HTMLMediaElement要素自体で
needkeyイベントを発生させ、アプリケーションはそれを処理し、最終的にキーを提供する必要があります。
<video src="foo.webm" autoplay onneedkey="handleKeyNeeded(event)"></video>
handleKeyNeeded()
関数はそれほど複雑ではありません-ブラウザーが必要と
するキー
識別子を受け取り
、サーバーにXHRリクエストを送信し、ブラウザーにanswer =キーを返します(または、必要に応じてキーを返しません-これは既にビジネスロジックです)。 それを少し単純化します-すでにキーを用意しましょう。 使用する
クリアキー+ AESスキームの場合、16バイトの
Uint8Array
ます。 関数は次のようになります。
function handleKeyNeeded(event) { var video = event.target; var initData = event.initData;
ここの主なキャラクター:
event.initData
:識別子。対応するキーはブラウザに必要です。key
:復号化キー自体。keySession.update(key)
:この呼び出しで、ブラウザーは同じキーを受け取ります。 より多くのページから、必須ではありません。
handleKeyNeeded()の残りの機能コード(MediaKeys、MediaKeySessionクラスなど)に興味がある人は、
Catboサービスを使用して
作成され
た将来のEME仕様の新しい
翻訳を使用できます。
したがって、EMEサポート(現在のバージョン2)を備えたブラウザーを使用している場合、
encrypted_media_player_v2.htmlページで、ビデオのケージを歩いているクロクマを見つけます(暗号化されたビデオのサンプルは
bear-320x240-av-enc_av.webm
Chromium code)。 この記事の執筆時点では、高い確率でそのようなブラウザはありません。 ただし、ページコードを少し変更しても、バージョン26以降のGoogle ChromeまたはChromiumブラウザを使用してクマを見ることができます(ただし、サポートはそれらにのみあります):
encrypted_media_player.html 。
次に、サンプルを機能させるためにどのような改善が必要かを検討します。 まず、Chrome / Chromiumは、将来のEME仕様のバージョン1をサポートするようになりました。EMEの作成者は、バージョン2を優先して廃止し、後者をオブジェクト指向にしました。 ただし、Chrome / Chromiumでは、これまでのところ最初のバージョンのEMEのみが含まれています。 さらに、多くの場所で
webkit
にプレフィックスを付ける必要があります。 このため、
handleKeyNeeded()
関数は次のように変更されます。
function handleKeyNeeded(event) { ... var keySystem = "webkit-org.w3.clearkey"; video.webkitGenerateKeyRequest(keySystem, event.initData);
次に、
video
タグの
src
属性を直接設定する場合、
needkey
イベントを待機しません。 実際、この場合、ビデオはブラウザーで使用されるffmpeg
ストック機能によって再生され、コンテナー内の暗号化フラグには注意を払っていません(Chrome / Chromiumでのメディアスタックの実装に関するいくつかの技術的な詳細があります)。 ただし、プレーヤーにコンテンツを提供する別の方法を使用すると、必要な結果が得られます(
needkey
イベントを
needkey
ます)。 このもう1つの方法は
Media Source Extensionsと呼ばれます。 その本質は、JavaScriptコードが後で再生するためにメディアストリームを生成できることです。 実際、これは、WebMやmp4などの
デマルチプレクサの代替実装がGoogleのブラウザに登場したことを意味します。 必要なneedkeyイベントを興奮させるように教えられたのは彼らでした。 クマの動画を
video
タグにダウンロードする適切なコードは次のとおりです。
function load() { var video = document.getElementById("video"); var mediaFile = "bear-320x240-av-enc_av.webm";
もちろん、このコードは単純な割り当てよりも汎用性が低くなります。
video.src = "bear-320x240-av-enc_av.webm";
; さらに、将来のEME仕様ではこのようなトリックは必要ありません(ただし、これまでのところ、操作性を実現することしかできません)。 今後の発展を楽しみにしています。
この記事以外では、ビデオを暗号化する方法についての質問が残っています。 このタスクはコンテナ固有です。 たとえば、WebMにはこの機能がありますが、これは他のコンテナーなどには当てはまりません。
EMEテーマのリンク:
Google、Microsoft、NetflixはHTML5にDRMを追加したい暗号化メディア拡張機能仕様の翻訳/ HTML5暗号化メディアコンテンツ