ApsaraVideo Player SDK は、セキュアダウンロード機能を提供します。このモードでローカルデバイスにダウンロードされた動画は暗号化されます。暗号化された動画は、指定したアプリから生成されたキーファイルを使用してのみ再生できます。セキュアダウンロードは、動画を悪意のある再生や配布から保護します。このトピックでは、ApsaraVideo Player SDK for Android および iOS を使用して動画を安全にダウンロードする方法について説明します。
このトピックのすべての機能関連のコードと実装の詳細については、API-Example デモプロジェクトを参照し、ベストプラクティスに基づいてコードを適応させることを推奨します。
具体的な実装については、このトピックで説明されているソリューションを使用し、対応する API-Example-Android および API-Example-iOS の 動画ダウンロードとオフライン再生 モジュールのソースコードを参照できます。
概要
ApsaraVideo VOD は、オフライン再生のためにモバイルデバイスへの動画ダウンロードをサポートしています。通常ダウンロードモードとセキュアダウンロードモードがサポートされています。以下に、2つのモードの違いについて説明します:
セキュアダウンロード (推奨): このモードでダウンロードされた動画は、Alibaba Cloud によって暗号化されます。動画を再生する前に、キーファイルを使用して動画を復号化する必要があります。動画は ApsaraVideo Player を使用してのみ再生できます。
通常ダウンロード: このモードでダウンロードされた動画は Alibaba Cloud によって暗号化されず、任意のプレーヤーでコピーして再生できます。通常ダウンロードモードを使用する際は注意してください。
セキュアダウンロードは、ダウンロードする動画が暗号化されることを保証します。暗号化された動画は、ApsaraVideo VOD コンソールでキーファイルを生成する際に指定したアプリを使用してのみ再生できます。通常ダウンロードモードと比較して、セキュアダウンロードモードはより信頼性が高く、ダウンロードされた動画の著作権を保護するのに適しています。ほとんどの場合、セキュアダウンロードモードを使用することを推奨します。
制限事項
セキュアダウンロード機能を使用するには、ApsaraVideo Player SDK を統合する必要があります。
ApsaraVideo Player SDK は、VidSts と VidAuth にのみ基づくセキュアダウンロードをサポートしています。
セキュアダウンロードモードを使用してダウンロードされた動画は、ローカルデバイス上で暗号化され、指定したアプリの ApsaraVideo Player SDK の再生 URL に基づいてのみ再生できます。
前提条件
ApsaraVideo VOD コンソールでダウンロード機能が有効になっており、[ダウンロードモード] が [セキュアダウンロード] に設定されていること。詳細については、「ダウンロード設定の設定」をご参照ください。
ApsaraVideo Player SDK が統合されていること。詳細については、「ApsaraVideo Player for Android のクイック統合」または「ApsaraVideo Player for iOS のクイック統合」をご参照ください。
動画が Alibaba Cloud 専用の暗号化 または HLS 暗号化 を使用して暗号化されていること。
Android の主要な実装
セキュアダウンロード設定
暗号化検証用のキーファイルを設定します。
ApsaraVideo VOD コンソールで生成されたキーファイルを ApsaraVideo Player SDK で設定します。キーファイルは、ダウンロードおよび再生用の動画を暗号化および復号化するために使用されます。キーファイルの生成方法の詳細については、「セキュアダウンロード」をご参照ください。
説明キーファイルの情報が指定したアプリ情報と一致していることを確認してください。そうでない場合、動画のダウンロードは失敗します。
アプリケーションでセキュリティファイルを設定するのは一度だけにすることを推奨します。サンプルコード:
PrivateService.initService(getApplicationContext(), "encryptedApp.dat があるファイルパス"); // encryptedApp.dat 検証ファイルを携帯電話に保存し、ここで検証ファイルのローカルファイルパスを設定することを推奨します。ダウンローダーを作成して設定します。
AliDownloaderFactory を使用してダウンローダーを作成できます。次のコードは例です:
AliMediaDownloader mAliDownloader = null; ...... // ダウンローダーを作成します。 mAliDownloader = AliDownloaderFactory.create(getApplicationContext()); // ダウンロードの保存パスを設定します。 mAliDownloader.setSaveDir("保存フォルダーのアドレス");イベントリスナーを設定します。
ダウンローダーは複数のイベントリスナーを提供します。次のコードは例です:
ダウンロードソースを準備します。
prepareメソッドを使用してダウンロードソースを準備できます。ダウンロードソースは VidSts と VidAuth メソッドをサポートしています。次のコードは例です:VidSts
// VidSts を作成します。 VidSts aliyunVidSts = new VidSts(); aliyunVidSts.setVid("VID 情報");// 動画 ID。 aliyunVidSts.setAccessKeyId("<yourAccessKeyId>");// 一時的な STS トークンの AccessKey ID。STS の AssumeRole 操作を呼び出して生成する必要があります。 aliyunVidSts.setAccessKeySecret("<yourAccessKeySecret>");// 一時的な STS トークンの AccessKey Secret。STS の AssumeRole 操作を呼び出して生成する必要があります。 aliyunVidSts.setSecurityToken("<yourSecurityToken>");// STS セキュリティトークン。STS の AssumeRole 操作を呼び出して生成する必要があります。 aliyunVidSts.setRegion("リージョン");// ApsaraVideo VOD がアクティブ化されているリージョン。デフォルト値は cn-shanghai です。 // VOD コンソールで HLS 標準暗号化パラメーターのパススルーを有効にし、デフォルトのパラメーター名が MtsHlsUriToken である場合は、config を設定して vid に渡す必要があります。以下を参照してください。 // VOD コンソールで HLS 標準暗号化パラメーターのパススルーを有効にしていない場合は、以下のコードを統合する必要はありません。 VidPlayerConfigGen vidConfig = new VidPlayerConfigGen(); vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>"); aliyunVidSts.setPlayerConfig(config); // ダウンロードソースを準備します。 mAliDownloader.prepare(aliyunVidSts)VidAuth
// VidAuth を作成します。 VidAuth vidAuth = new VidAuth(); vidAuth.setVid("VID 情報");// 動画 ID。 vidAuth.setPlayAuth("<yourPlayAuth>");// 再生認証情報。ApsaraVideo VOD の GetVideoPlayAuth 操作を呼び出して生成する必要があります。 vidAuth.setRegion("リージョン");// ApsaraVideo Player SDK V5.5.5.0 以降では、このパラメーターは非推奨です。リージョンを設定する必要はありません。プレーヤーが自動的にリージョンを解析します。5.5.5.0 より前のバージョンでは、このパラメーターは必須です。ApsaraVideo VOD がアクティブ化されているリージョン。デフォルト値は cn-shanghai です。 // VOD コンソールで HLS 標準暗号化パラメーターのパススルーを有効にし、デフォルトのパラメーター名が MtsHlsUriToken である場合は、config を設定して vid に渡す必要があります。以下を参照してください。 VidPlayerConfigGen vidConfig = new VidPlayerConfigGen(); vidConfig.setMtsHlsUriToken("<yourMtsHlsUriToken>"); vidAuth.setPlayerConfig(config); // ダウンロードソースを準備します。 mAliDownloader.prepare(vidAuth);
説明ソースファイルのフォーマットは、ダウンロードされた出力ファイルのフォーマットと同じでなければなりません。フォーマットは変更できません。
VOD コンソールで HLS 暗号化パラメーターのパススルーを有効にする場合、デフォルトのパラメーター名は MtsHIsUriToken です。詳細については、「HLS 暗号化パラメーターのパススルー」をご参照ください。次に、上記のコードに示すように、VOD ソースで MtsHIsUriToken の値を設定します。
準備が成功したら、ダウンロード項目を選択してダウンロードを開始します。
準備が成功すると、
OnPreparedListenerメソッドがコールバックされます。返される TrackInfo には、各ビデオストリームの解像度などの情報が含まれています。ダウンロードするトラックを選択できます。次のコードは例です:public void onPrepared(MediaInfo mediaInfo) { // ダウンロード項目が正常に準備されました。 List<TrackInfo> trackInfos = mediaInfo.getTrackInfos(); // たとえば、最初の TrackInfo をダウンロードします。 mAliDownloader.selectItem(trackInfos.get(0).getIndex()); // ダウンロードを開始します。 mAliDownloader.start(); }(オプション) ダウンロードソースを更新します。
VidSts と VidAuth の有効期限が切れるのを防ぐために、ダウンロードを開始する前にダウンロードソース情報を更新することもできます。次のコードは例です:
// ダウンロードソースを更新します。 mAliDownloader.updateSource(VidSts); // ダウンロードを開始します。 mAliDownloader.start();ダウンロードが成功または失敗した後、ダウンローダーを解放します。
ダウンロードが成功した後、
releaseまたはonErrorコールバックでonCompletionを呼び出してダウンローダーを解放できます。次のコードは例です:mAliDownloader.stop(); mAliDownloader.release();オプション: ダウンロードしたファイルを削除します。
ダウンロード中またはダウンロードプロセス後に、ダウンロードしたファイルを削除できます。次のコードは例です:
// オブジェクトを介してファイルを削除します。 mAliDownloader.deleteFile(); // 静的メソッドを使用してファイルを削除します。成功した場合は 0 を返します。 AliDownloaderFactory.deleteFile("削除するダウンロードフォルダーのパス","動画 ID","動画フォーマット","ダウンロードした動画のインデックス");
ダウンロードした動画の再生
ダウンロードされた動画は、ApsaraVideo Player SDK の再生 URL に基づいてのみ再生できます。ダウンロードした動画を再生するには、次の手順を実行します:
ダウンロードが完了したら、動画ファイルの絶対パスを取得します。
String path = mAliDownloader.getFilePath();UrlSource メソッドを使用して再生用の絶対パスを設定します。
UrlSource urlSource = new UrlSource(); urlSource.setUri("再生 URL");// ダウンロードした動画の絶対パスを設定します。 aliPlayer.setDataSource(urlSource);
iOS の主要な実装
セキュアダウンロード設定
暗号化検証用のキーファイルを設定します。
ApsaraVideo VOD コンソールで生成されたキーファイルを ApsaraVideo Player SDK で設定します。キーファイルは、ダウンロードおよび再生用の動画を暗号化および復号化するために使用されます。キーファイルの生成方法の詳細については、「セキュアダウンロード」をご参照ください。
説明キーファイルの情報が指定したアプリ情報と一致していることを確認してください。そうでない場合、動画のダウンロードは失敗します。
アプリケーションでセキュリティファイルを設定するのは一度だけにすることを推奨します。サンプルコード:
NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"]; [AliPrivateService initKey:encrptyFilePath];ダウンローダーを作成して設定します。
以下に例を示します:
AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init]; [downloader setSaveDirectory:self.downLoadPath]; [downloader setDelegate:self];イベントリスナーを設定します。
ダウンローダーは複数のイベントリスナーを提供します。
-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { // ダウンロード項目が正常に準備されました。 } -(void)onError:(AliMediaDownloader *)downloader errorModel:(AVPErrorModel *)errorModel { // ダウンロードエラーが発生しました。 } -(void)onDownloadingProgress:(AliMediaDownloader *)downloader percentage:(int)percent { // ダウンロードの進行状況 (パーセンテージ)。 } -(void)onProcessingProgress:(AliMediaDownloader *)downloader percentage:(int)percent { // 処理の進行状況 (パーセンテージ)。 } -(void)onCompletion:(AliMediaDownloader *)downloader { // ダウンロードが成功しました。 }ダウンロードソースを準備します。
prepareメソッドを呼び出してダウンロードソースを準備します。VidSts と VidAuth がサポートされています。例:VidSts
// VidSts を作成します。 AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init]; stsSource.region = @"リージョン"; // ApsaraVideo VOD のリージョン。デフォルトは cn-shanghai です。 stsSource.vid = @"VID 情報"; // 動画 ID (VideoId)。 stsSource.securityToken = @"<yourSecurityToken>"; // STS トークン。STS の AssumeRole 操作を呼び出して生成する必要があります。 stsSource.accessKeySecret = @"<yourAccessKeySecret>"; // 一時的な STS AccessKey ペアの AccessKey Secret。STS の AssumeRole 操作を呼び出して生成する必要があります。 stsSource.accessKeyId = @"<yourAccessKeyId>"; // 一時的な STS AccessKey ペアの AccessKey ID。STS の AssumeRole 操作を呼び出して生成する必要があります。 // ApsaraVideo VOD コンソールで HLS 暗号化パラメーターのパススルーを有効にし、デフォルトのパラメーター名が MtsHlsUriToken である場合は、config を設定して vid に渡す必要があります。次のコードを参照してください。 // ApsaraVideo VOD コンソールで HLS 暗号化パラメーターのパススルーを有効にしていない場合は、次のコードを統合する必要はありません。 VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init]; [vp setHlsUriToken:yourMtsHlsUriToken]; stsSource.playConfig = [vp generatePlayerConfig]; // ダウンロードソースを準備します。 [downloader prepareWithVid:stsSource];VidAuth
// VidAuth を作成します。 AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init]; authSource.vid = @"VID 情報"; // 動画 ID (VideoId)。 authSource.playAuth = @"<yourPlayAuth>"; // 再生認証情報。ApsaraVideo VOD の GetVideoPlayAuth 操作を呼び出して生成する必要があります。 authSource.region = @"リージョン"; // プレーヤー SDK V5.5.5.0 以降では、このパラメーターは非推奨です。リージョンを設定する必要はありません。プレーヤーが自動的にリージョンを解析します。5.5.5.0 より前のプレーヤー SDK バージョンでは、このパラメーターは必須です。ApsaraVideo VOD のリージョン。デフォルトは cn-shanghai です。 // ApsaraVideo VOD コンソールで HLS 暗号化パラメーターのパススルーを有効にし、デフォルトのパラメーター名が MtsHlsUriToken である場合は、config を設定して vid に渡す必要があります。次のコードを参照してください。 // ApsaraVideo VOD コンソールで HLS 暗号化パラメーターのパススルーを有効にしていない場合は、次のコードを統合する必要はありません。 VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init]; [vp setHlsUriToken:yourMtsHlsUriToken]; authSource.playConfig = [vp generatePlayerConfig]; // ダウンロードソースを準備します。 [downloader prepareWithVid:authSource];
説明VOD コンソールで HLS 暗号化のパラメーターパススルーを有効にする場合、デフォルトのパラメーター名は MtsHIsUriToken です。詳細については、「HLS 暗号化のパラメーターパススルー」をご参照ください。次に、前のコードに従って、VOD ソースで MtsHIsUriToken の値を設定します。
準備が完了したら、ダウンロード項目を選択します。
準備が成功すると、
onPreparedメソッドがコールバックされます。返される TrackInfo には、ビデオストリームの解像度などの情報が含まれています。ダウンロードするトラックを選択します。次のサンプルコードは例です:-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { NSArray<AVPTrackInfo*>* tracks = info.tracks; // たとえば、最初の TrackInfo をダウンロードします。 [downloader selectTrack:[tracks objectAtIndex:0].trackIndex]; }ダウンロードソースを更新してダウンロードを開始します。
ダウンロード前に VidSts または VidAuth の有効期限が切れる可能性があります。したがって、ダウンロードを開始する前にダウンロードソースを更新することを推奨します。
// ダウンロードソースを更新します。 [downloader updateWithVid:vidSource] // ダウンロードを開始します。 [downloader start];ダウンロードが成功または失敗した後、ダウンローダーを解放します。
ダウンロードが成功した後、
destroyを呼び出してダウンローダーを解放します。[self.downloader destroy]; self.downloader = nil;
ダウンロードした動画の再生
ダウンロードされた動画は、ApsaraVideo Player SDK の再生 URL に基づいてのみ再生できます。ダウンロードした動画を再生するには、次の手順を実行します:
ダウンロードした動画ファイルの絶対パスを取得します。
説明ダウンロードした動画ファイルの絶対パスを生成するには、次の手順を実行することを推奨します:
downloadedFilePathからカスタムストレージパスとファイル名を取得し、サンドボックスディレクトリを取得してから、カスタムストレージパス、ファイル名、およびサンドボックスディレクトリを連結します。NSString *downloadedFilePath = downloader.downloadedFilePath;UrlSource をダウンロードした動画ファイルの絶対パスに設定して、動画を再生します。
AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:downloadedFilePath]; [self.player setUrlSource:urlSource];