質問
私がやりたいことは次のことです。ビデオコンテンツを保護し(暗号化)、再生できる必要があります。
トリッキーな部分は、私たちがすべてを一度にメモリにロードしてそこに復号化したくないということです(それもオプションです)
本質的に探しているのは、HDDから絡み合ったビデオコンテンツを再生するためのソリューションであり、アプリケーションのみがそのビデオを再生できるようにします。
ただし、ブロックごとにファイルを読み取る必要があります(2GBファイルを扱っている場合、一度にメモリにロードするべきではありません)。
私たちに知らせてください、可能な方法は何ですか?
Silverlight4 DRM-さて、これは合理的なソリューションのように見え、私たちのニーズに合わせて十分に柔軟です。ただし、PlayReady SDKの費用は約30,000ドルで、Silverlightを使用したくありません。おそらくC#またはC ++
私たちが持っていたアイデアの1つは、大きなビデオファイルを分割して暗号化されたビデオファイル(シーケンスなど)を分離し、各ファイル( "block")をロードして直接メモリ/復号化し、メモリから再生する(およびシーケンスファイル間で交互に再生する)ことです。これはこれまでで最も簡単なものであり、おそらく実際にできることのようです。ただし、MemoryStreamからビデオファイルを再生できるLIBは何ですか?私はVLCがそれを行うことができるはずだと信じています..?
もう1つのアイデアは、圧縮されていないAVIを取得し、フレームごとにビデオフレームを処理し、各フレームを変更し(どういうわけか暗号化)、ビデオを再生すると、メモリでフレームを再処理して復号化することでした。
特定のコーデックのみを扱ってカスタムソリューションを書くこと - 実際にはこれはかなりクールに聞こえますが、時間がかかりすぎるのではないかと心配していますが、このアプローチについてお知らせください
もう1つは、VLCを使用してLocalHostから暗号化されたストリームを再生します(アプリケーションは、暗号化されたHDDファイルをLocalHost:800/Blahblahにストリーミングします)。同じアプリケーションがVLCコントロールで暗号化されたストリームを復号化します。 HDDのファイルも実際に暗号化できるかどうかはまだわかりません(ユーザーは他のプレーヤーでそのファイルを再生できないでしょう)。
解決
再生パイプラインは、通常、一緒に接続されたコンポーネントのセットです。の DirectShow
, 、APIの1つと最も人気のあるものの1つである、読者、スプリッター、コーデック、ポストプロセス、フィルターとして知られるプレゼンテーションパーツを使用し、全体が再生されます。暗号化されたコンテンツとデコードをその場で読み取る独自の交換品に読者を置き換えることができます。簡単にオンデマンドでデコードできます。たとえば、最初のフレームやサムネイルを取得するために、2GBブロック全体をデコードする必要はありません。
読者の部分をフックしただけで、カスタムアルゴリズムの1つであるAPIまたは外部ライブラリの間で、暗号化方法を自由に選択できます。
それでも、これと他の(少なくとも他のほとんどの)方法では、エンコードされたコンテンツを逆にすることができないという弾丸の証拠保証が得られないと思います。他の誰かがまだパイプラインに接続し、そこからデコードされたコンテンツをつかむことができます。これが少なくとも実装するために複雑さと経験が必要になることに満足しているなら、そのような暗号化はかなりうまくいくでしょう。
他のヒント
ほぼすべての広く使用されている暗号化アルゴリズムは、128〜256ビットのサイズのブロックで動作し、一度にこれらのほんの一部しか復号化されず、ストリーミングには問題ありません。たとえば、チェックしてください 暗号++ ストリーミングインターフェイスを備えたソフトウェアライブラリ用。 (つまり、ファイルを開き、その周りに復号化フィルターを置いてから、他のファイルと同じように続きます。)
わかりました、これは私がそれをした方法です。 (アンドロイド)
暗号化されたビデオはSDカードに配置されています。 RC4暗号化 - ストリーミング中にフライで変換できます。次に、デバイスで(サービスとして)実行されるローカルファイルサーバーを作成しました。出力ストリームは、データを送信する前に少し余分なことを行います。バッファに書き出す前に、RC4復号化を介してフィルターを塗ります。次に、メディアプレーヤーにビデオのURL(http:// localhost:port/abc.3gp ")を指定します。その結果、SDCardのビデオは安全なままです - キーを持っていない限りプレイすることはできません - 追加のセキュリティのために、ビデオごとに異なるはずです。
Ansersをありがとうございました。私は多くの異なるアプローチを経験した男です。
MP4を再生し、シェーダーを使用してGPUの各フレームを復号化できるOpenGL+FFMPEGを使用して自分のビデオプレーヤーを書きました。また、VLCを使用してWebサーバーからのストリーミングなど、別の可能なソリューションを実験しました。 (VLCは、ストリームを扱うときに何らかの暗号化/復号化を提供します)、Yada Yada Yada。
また、1つの解決策は4つのメディアエレメント(WPF)を使用することであり、実際のビデオは実質的に4つの領域に分割され、各エリアが回転したため、ビデオは表示できませんでした。ビデオを4つのMediaElementsにロードしたら、どの部分を表示したいかをマップし、それを戻します。しかし、正直なところ、MediaElementは悪いです。
しかし、私はロマンが言ったことで正確に終わりました。 mp4splitter、ffdshow、videoRendererを使用してDirectShowグラフを作成しました。読み取りは、MP4Splitterが使用するBaseSplitter/asyncreader.cpp(Syncread関数を変更するだけです)で発生します。
自分で実装したい場合は、MPC-HCプロジェクトを使用して、好きなようにフィルターを変更してください。 Directshowのコンセプトを回避するのに時間がかかりましたが、理解すれば素晴らしい武器になります。