web-dev-qa-db-ja.com

暗号化されたビデオの再生

次にやりたいのは、ビデオコンテンツを保護(暗号化)して再生できるようにする必要があるということです。

トリッキーな部分は、すべてを一度にメモリにロードしてそこで復号化したくないということです(これもオプションですが)

本質的に探しているのは、HDDから暗号化されたビデオコンテンツを再生して、アプリケーションだけがそのビデオを再生できるようにするためのソリューションです。

ただし、ブロックごとにファイルを読み取る必要があります(2GBのファイルを処理している場合は、一度にメモリにロードしないでください)。

可能な方法は何ですか?

  • SilverLight4 DRM-さて、これは合理的なソリューションのように見え、私たちのニーズに十分な柔軟性があります。ただし、PlayReady SDKの価格は約30,000ドルであり、SilverLightは使用したくありません。おそらくC#またはC++

  • 私たちが持っていたアイデアの1つは、大きなビデオファイルを分割して暗号化されたビデオファイル(シーケンスなど)を分離し、各ファイル(「ブロック」)をロードして直接メモリ/復号化し、メモリから再生する(そしてシーケンスファイルを切り替える)ことです。これはこれまでで最も簡単なもののようで、おそらく実際にできることです。ただし、どのライブラリがmemoryStreamからビデオファイルを再生できますか?私はVLCがそれを行うことができるはずだと信じています..?

  • もう1つのアイデアは、非圧縮AVIを取得し、ビデオをフレームごとに処理し、各フレームを変更する(何らかの方法で暗号化する)ことでした。ビデオを再生するときに、メモリ内のフレームを再処理して復号化します。

  • 特定のコーデックを1つだけ処理し、そのカスタムソリューションを作成します。実際、これはかなりクールに聞こえますが、時間がかかりすぎるのではないかと心配していますが、このアプローチについて教えてください。

  • もう1つは、VLCを使用してローカルホストから暗号化されたストリームを再生し(たとえば、アプリケーションは暗号化されたHDDファイルをlocalhost:800/BLAHBLAHにストリーミングしています)、同じアプリケーションが暗号化されたストリームを復号化するためのVLC制御を持っています。 HDD上のファイルも実際に暗号化できるかどうかはまだわかりません(したがって、ユーザーはそのファイルを別のプレーヤーで再生できません)。さらに、VLCはGPLであり、私たちには適していません。

14

再生パイプラインは通常、一緒に接続されたコンポーネントのセットです。 APIの1つで最も人気のあるDirectShowでは、リーダー、スプリッター、コーデック、フィルターと呼ばれる後処理とプレゼンテーションの部分を使用し、すべてが再生されます。リーダーを、暗号化されたコンテンツを読み取り、その場でデコードする独自の代替品に置き換えることができます。オンデマンドで簡単にデコードできます。たとえば、最初のフレームやサムネイルを取得するために2GBブロック全体をデコードする必要はありません。

リーダー部分をフックしただけで、カスタムアルゴリズム、よく知られているAPI、または外部ライブラリのいずれかから暗号化方法を自由に選択できます。

それでも、この方法や他の(少なくとも他のほとんどの)方法では、エンコードされたコンテンツを元に戻せないという防弾保証は得られないと思います。他の誰かがパイプラインにフックして、そこからデコードされたコンテンツを取得することができます。これを実装するために少なくとも複雑さと経験が必要になることに満足している場合は、そのような暗号化はかなりうまくいくでしょう。

7
Roman R.

広く使用されているほぼすべての暗号化アルゴリズムは、128〜256ビットのサイズのブロックで機能し、一度にこれらのいくつかだけを問題なく復号化します。ストリーミングには問題ありません。ストリーミングインターフェイスを備えたソフトウェアライブラリについては、たとえば Crypto ++ を確認してください。 (つまり、ファイルを開いてその周りに復号化フィルターを配置し、他のファイルとほとんど同じように続行します。)

わかりました、これは私がそれをした方法です。 (アンドロイド)

暗号化されたビデオはSDカードに配置されます。 RC4暗号化-ストリーミング中にオンザフライで変換できるようにします。次に、デバイス上で(サービスとして)実行されるローカルファイルサーバーを作成しました。出力ストリームは、データを送信する前に少し余分なことを行います。データをバッファに書き出す前に、RC4復号化プログラムでフィルタリングします。次に、メディアプレーヤーにビデオのURL(http:// localhost:port/abc.3gp ")を指定するだけです。その結果、sdcardからのビデオは安全なままであり、キーがないと再生できません。セキュリティを強化するために、ビデオごとに異なる必要があります。

7
josephus

回答ありがとうございます。私は多くの異なるアプローチを経験した男です。

Mp4を再生し、シェーダーを使用してGPUの各フレームを復号化できるopenGL + FFMPEGを使用して独自のビデオプレーヤーを作成しました。また、VLCを使用したWebサーバーからのストリーミングなど、別の可能な解決策を試しました。 (VLCは、ストリームを処理するときに、ある種の暗号化/復号化を提供します)、およびyada yadayada。

また、1つの解決策は、4つのmediaelements(WPF)を使用することで、実際のビデオは実質的に4つの領域に分割され、各領域が回転してビデオが表示されなくなりました。ビデオを4つのメディア要素にロードしたら、表示する部分をマップし、回転して戻すことができます。しかし、正直なところ、MediaElementは悪いです。

しかし、私はRomanRが言ったことに正確に行き着きました。 mp4splitter、ffdshow、videorendererを使用してDirectShowグラフを作成し、mp4splittersourcefilterを変更しました。読み取りは、mp4splitterが使用するBaseSplitter/AsyncReader.cpp(SyncRead関数を変更するだけ)で行われます。

自分で実装したい場合は、MPC-HCプロジェクトを使用して、必要に応じてフィルターを変更してください。 DirectShowの概念を理解するのに少し時間がかかりましたが、一度理解すれば、それは素晴らしい武器になります。

http://sourceforge.net/apps/trac/mpc-hc/

4

ファイル仮想化を使用するWindowsの方法があります。アイデアは、それらのコンテンツが暗号化され、オンデマンドで復号化できる疑似ファイルを作成することです。例えば。 BoxedApp SDKを使用して、 BoxedAppSDK_CreateVirtualFileBasedOnIStream を使用してIStreamに基づく仮想ファイルを作成します。次に、仮想ファイルのパスをプレーヤー(外部アプリケーション、またはメディアプレーヤーActiveX)に渡します。プレーヤーが復号化されたデータの次の部分を必要とする場合、この要求はIStreamに渡され、その実装はデータを復号化して返します。したがって、ファイル全体が完全に復号化されることはありません。 大規模なステップバイステップのチュートリアル もあります。

0
Artem Razin