6

私は、プライベート ビデオのダウンロードと HTTP ライブ ストリーミングを可能にするiOSアプリ取り組んいます。動画は Amazon S3 バケットに保存されます ( /ファイルとしてセグメント化されます)。また、 CloudFrontがオンになり、バケットに接続されます。mp4m3u8ts

コンテンツは非公開であるため、CloudFront 経由で接続するときに URL に署名する必要があります。URL に署名するには秘密鍵を使用する必要があるため、バンドルに秘密鍵を保存しないと、iOS アプリで署名付き URL を生成することはできません。そして、それは悪い考えです!

そこで、次のように URL 署名を実行し、生成された署名付き CloudFront URL にリダイレクトする単純な Ruby サーバーを作成することにしました。


http://signing.server.local/videos/1.mp4 https://acbdefg123456.cloudfront.net/videos/1.mp4??Expires=XXX&Signature=XXX&Key-Pair-Id=XXX

http://signing.server.local/videos/1.m3u8 https://acbdefg123456.cloudfront.net/videos/1.m3u8??Expires=XXX&Signature=XXX&Key-Pair-Id=XXX


ビデオのダウンロードの場合は、リクエストが 1 つしかないため、うまく機能します。しかし、コンテンツをストリーミングしMPMoviePlayerControllerて署名サーバーの URL を指定すると、最初のリクエストのみがサーバーによって署名され、CloudFront にリダイレクトされます。次のリクエストでMPMoviePlayerControllerは、最初に署名された CloudFront URL をベースとして取得し、署名サーバーをスローせずに直接接続を試みます。

m3u8ファイル内のパスは相対パスです。

署名サーバーを介してすべてのコンテンツを送信する必要なく、この機能を実装する方法について何か提案はありますか?

4

3 に答える 3

9

S3/CloudFront またはその他のストレージ/CDN でプライベート HLS を実行する正しい方法は、HLS 暗号化を使用することですこのトピックについては、Apple のドキュメントを参照してください。

プレイリストとセグメント化されたビデオ ファイルが保存されるストレージに加えて、最上位のプレイリストとキーを保存するための安全な HTTPS サーバーを統合する必要があります。これらのキーは、Apple HLS ツールを使用したセグメント化中に生成されます。

仕組みは次のとおりです。

  1. は、セキュア HTTPS サーバ上MPMoviePlayerControllerのトップ レベルの再生リスト ( ) を指す URL を取得します。.m3u8
  2. このファイルにはprog_index.m3u8、S3/CloudFront に保存され、ビデオ ファイル ( .ts) を指すバリアント プレイリスト ( ) へのリンクがあります。
  3. さらに、バリアント プレイリストには、ビデオ ファイルを読み取るために必要なキーへのリンクが含まれています。これらのキーは、安全な HTTPS サーバーにも保存されます。

次の画像を参照してください。

HLS キーの保護

プレゼンテーションMobile Movies with HTTP LIVE Streaming (CocoaConf DC、2012 年 6 月) からの抜粋

もちろん、インフラストラクチャをより安全にする可能性はあります。リンクされた Apple のドキュメントを参照してください。

また、セグメンテーション用の Ruby スクリプトを作成して、指定されたベース URL を使用して出力を生成しました。これにより、作業が大幅に簡素化されました。

于 2014-01-25T10:36:47.497 に答える