ApsaraVideo for VOD は、自動キャプチャされたスナップショットをデフォルトのビデオサムネイルとして使用します。アップロード中またはアップロード後に、カスタムサムネイルを指定できます。
概要
ApsaraVideo for VOD にアップロードされたすべてのビデオには、サムネイルがあります。
アップロード時にサムネイルを指定した場合、その画像が使用されます。指定しない場合、ApsaraVideo for VOD は 1〜8 枚のスナップショットをキャプチャし、中央の 1 枚をデフォルトとして選択します (詳細は、「ビデオスナップショット」をご参照ください)。アップロード後にサムネイルを更新できます。
ApsaraVideo for VOD は、通常サムネイルとスマートサムネイルをサポートしています。
アップロード時のサムネイル設定
アップロード時にサムネイルを指定できるのは、API または SDK を使用する場合のみです (詳細は、「アップロード方法」をご参照ください)。
重要 CoverURL パラメーターは任意の URL を受け付けます。ApsaraVideo for VOD はこの URL を保存し、リクエストに応じて返します。URL がアクセス可能であることを確認してください。
アップロード後のサムネイル更新
ビデオをアップロードした後、次の方法でサムネイルを更新します。
通常サムネイルの設定
コンソール
ApsaraVideo for VOD コンソールで、ローカル画像またはビデオスナップショットを使用してビデオサムネイルを更新します。
ApsaraVideo for VOD コンソールにログインします。
左側のナビゲーションウィンドウで、[メディアファイル]> [オーディオ /ビデオ] を選択します。
更新するビデオを探し、[操作] 列の管理をクリックします。
基本情報 タブで、動画情報の編集 をクリックします。
保存をクリックして設定を完了します。
オーディオ/ビデオのリストに戻り、更新されたサムネイルを確認します。
OpenAPI
以下の API を呼び出して、ビデオサムネイルを更新します。アクセス可能な任意の URL をサムネイルソースとして使用できます。
重要 CoverURL パラメーターには、任意の URL を指定できます。ApsaraVideo for VOD はこの URL を保存し、リクエストに応じて返します。URL にはアクセスできるようにしてください。
UpdateVideoInfo 操作を呼び出し、CoverURL を渡してサムネイル URL を指定します。
UpdateVideoInfos 操作を呼び出し、UpdateContent 内で CoverURL を渡してサムネイル URL を指定します。
ビデオが ApsaraVideo for VOD に登録されている独自の OSS バケットにある場合、RegisterMedia 操作を呼び出し、RegisterMetadata 内の CoverURL を渡してサムネイル URL を指定します。
スマートサムネイルの設定
スマートサムネイル機能は、ビデオコンテンツ、視覚的な美しさ、および広範な制作データを分析して最適なキーフレームまたはセグメントを選択し、クリックスルー率とユーザーエクスペリエンスを向上させます。
説明 ApsaraVideo for VOD は、静止画およびアニメーションのサムネイル画像をサポートしています。ビデオサムネイルはサポートされていません。
使用方法
AddAITemplate 操作を呼び出して、スマートサムネイルテンプレートを作成します。TemplateType パラメーターを AIImage に設定し、必要に応じて他のパラメーターを設定します。
SubmitAIImageJob 操作を呼び出して、スマートサムネイルジョブを送信します。AITemplateId パラメーターを作成したテンプレートの ID に設定し、必要に応じてその他のパラメーターを設定します。
例:先頭フレームをサムネイルとして設定
プロセスの概要
ビデオの先頭フレームをキャプチャするためのスナップショットテンプレートを作成します。
先頭フレームをキャプチャするためのスナップショットジョブを送信します。
ビデオサムネイルを、キャプチャした先頭フレームのスナップショットに設定します。
操作手順
コンソール
先頭フレームをキャプチャするためのスナップショットテンプレートを作成します。
ApsaraVideo for VOD コンソールにログインします。
左側のナビゲーションウィンドウで、[構成管理]> [メディア処理]> [スナップショットテンプレート] を選択します。
スナップショットテンプレートの追加 をクリックします。 最初のフレームをキャプチャするようにパラメーターを設定します。
テンプレート名 にはカスタム名を設定します。スクリーンショットの方法 には 通常のスクリーンショット を選択します。開始時間 を 00:00:00 に、スクリーンショットの数: を 1 に設定します。必要に応じてその他のパラメーターを設定します (スナップショットテンプレート)。
保存をクリックしてスナップショットテンプレートを作成します。
先頭フレームをキャプチャするためのスナップショットジョブを送信します。
ビデオサムネイルを先頭フレームのスナップショットに設定します。
説明 サムネイルとしてアップロードする前に、ステップ 2 のスナップショットをローカルコンピューターに保存してください。
ApsaraVideo for VOD コンソールで、メディアファイル > [オーディオ/ビデオ] を選択します。
音声/動画リストで、対象のビデオを見つけ、[操作] 列の 管理 をクリックします。
基本情報 タブで、動画情報の編集 をクリックします。
アップロード をクリックし、ローカルに保存した先頭フレームのスナップショットを選択し、[開く] をクリックします。
保存 をクリックして、動画のサムネイルを設定します。
オーディオ/ビデオのリストをチェックして、サムネイルの更新を確認します。
OpenAPI
説明 以下の例では、Alibaba Cloud SDK for Java を使用して ApsaraVideo for VOD API を呼び出します。
操作手順
先頭フレームをキャプチャするためのスナップショットテンプレートを作成します。
AddVodTemplate API を呼び出して、先頭フレームをキャプチャするためのスナップショットテンプレートを作成します。以下にコード例を示します。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.AddVodTemplateRequest;
import com.aliyuncs.vod.model.v20170321.AddVodTemplateResponse;
/**
* 注:
* 1. このデモは、先頭フレームを単一のスナップショットとしてキャプチャするテンプレートを作成する方法を示しています。
* 2. より便利に操作するために、ApsaraVideo for VOD コンソールでスナップショットテンプレートを作成することを推奨します。
*/
public class AddSnapshotTemplate {
// Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。API 操作の呼び出しや日常の O&M (運用と保守) には、RAM ユーザーの使用を推奨します。
// プロジェクトに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングした場合、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが損なわれる恐れがあります。
// この例では、環境変数を使用して認証用の AccessKey ペアを取得する方法を示します。コードを実行する前に、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を設定してください。
public static String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
public static String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
public static void main(String[] args) {
try{
DefaultAcsClient vodClient = initVodClient(accessKeyId, accessKeySecret);
AddVodTemplateResponse response = addSnapshotTemplate(vodClient);
System.out.println("RequestId is:" + response.getRequestId());
System.out.println("TemplateId is:" + response.getVodTemplateId());
}catch (Exception e){
}
}
public static AddVodTemplateResponse addSnapshotTemplate(DefaultAcsClient vodClient) throws ClientException {
AddVodTemplateRequest request = new AddVodTemplateRequest();
request.setName("First-frame snapshot template");
request.setTemplateType("Snapshot");
request.setTemplateConfig("{\"SnapshotType\":\"NormalSnapshot\",\"SnapshotConfig\":{\"FrameType\":\"normal\",\"Count\":1,\"Interval\":1,\"SpecifiedOffsetTime\":0}}");
return vodClient.getAcsResponse(request);
}
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
// ApsaraVideo for VOD が有効化されているリージョン。
String regionId = "cn-shanghai";
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
}
先頭フレームをキャプチャするためのスナップショットジョブを送信します。
SubmitSnapshotJob API を呼び出して、スナップショットジョブを送信します。以下にコード例を示します。
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.*;
/**
* 注:
* 1. このデモは、先頭フレームのスナップショットテンプレートが作成された後にスナップショットジョブを送信する方法を示しています。
* 2. 新しくアップロードされたビデオの場合、`VideoAnalysisComplete` イベントが成功した後にこのステップを実行することを推奨します。ステータスが Normal の既存のビデオについては、独自のプロセスを設計できます。
* 3. スナップショットは非同期タスクです。スナップショット URL を取得する前に、`SnapshotComplete` イベントが成功するのを待つことを推奨します。
* 4. イベントコールバックの `SnapshotRegular` からスナップショットの出力 URL を推測できます。URL 生成ルールについては、`SnapshotComplete` トピックをご参照ください。
* 5. コールバックサービスがない場合は、`ListSnapshots` API を呼び出して結果をポーリングすることもできます。この操作はデフォルトで最新のスナップショット結果のみを返します。詳細については、「`ListSnapshots` API リファレンス」をご参照ください。
*/
public class SubmitSnapshotJob {
// Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。API 操作の呼び出しや日常の O&M (運用と保守) には、RAM ユーザーの使用を推奨します。
// プロジェクトに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングした場合、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが損なわれる恐れがあります。
// この例では、環境変数を使用して認証用の AccessKey ペアを取得する方法を示します。コードを実行する前に、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を設定してください。
public static String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
public static String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
public static void main(String[] args) {
try{
DefaultAcsClient vodClient = initVodClient(accessKeyId, accessKeySecret);
SubmitSnapshotJobResponse response = submitSnapshotJob(vodClient);
System.out.println("RequestId is:" + response.getRequestId());
System.out.println("JobId is:" + response.getSnapshotJob().getJobId());
}catch (Exception e){
}
}
public static SubmitSnapshotJobResponse submitSnapshotJob(DefaultAcsClient vodClient) throws ClientException {
SubmitSnapshotJobRequest request = new SubmitSnapshotJobRequest();
request.setVideoId("a42b**********633b79f0102");
request.setSnapshotTemplateId("1f27a7**********eba2756");
// (オプション) コールバックで利用可能なカスタムパススルーパラメーターです。これを使用して、先頭フレームのスナップショットを識別できます。
request.setUserData("{\"Extend\":{\"SnapshotType\":\"FirstFrame\",\"VideoId\":\"a42bf540********33b79f0102\"}}");
return vodClient.getAcsResponse(request);
}
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
// ApsaraVideo for VOD が有効化されているリージョン。
String regionId = "cn-shanghai";
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
// ListSnapshots を呼び出してスナップショットを照会します。
public static ListSnapshotsResponse listSnapshots(DefaultAcsClient vodClient) throws ClientException {
ListSnapshotsRequest request = new ListSnapshotsRequest();
request.setVideoId("a42bf540b1b371ed804a6633b79****");
request.setSnapshotType("NormalSnapshot");
ListSnapshotsResponse response = vodClient.getAcsResponse(request);
System.out.println("RequestId is:" + response.getRequestId());
System.out.println("SnapshotUrl is:" + response.getMediaSnapshot().getSnapshots().get(0).getUrl());
return response;
}
}
ビデオサムネイルを先頭フレームのスナップショットに設定します。
この例では、アップロード後に単一のビデオのサムネイルを変更します。その他の方法については、「アップロード時のサムネイル設定」および「アップロード後のサムネイル更新」をご参照ください。
UpdateVideoInfo 操作を呼び出し、CoverURL パラメーターを渡してビデオのサムネイルを指定します。 次のコードに例を示します。
package com.alibaba.bltest.transcode;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.UpdateVideoInfoRequest;
import com.aliyuncs.vod.model.v20170321.UpdateVideoInfoResponse;
/**
* 注:
* 1. このデモは、単一のビデオのサムネイルを更新する方法を示しています。他のビデオパラメーターを変更するには、「UpdateVideoInfo API リファレンス」をご参照ください。
* 2. サムネイルを更新する際は、指定する画像 URL が有効であることを確認してください。
*/
public class UpdateVideoInfo {
// Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。API 操作の呼び出しや日常の O&M (運用と保守) には、RAM ユーザーの使用を推奨します。
// プロジェクトに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングした場合、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが損なわれる恐れがあります。
// この例では、環境変数を使用して認証用の AccessKey ペアを取得する方法を示します。コードを実行する前に、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を設定してください。
public static String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
public static String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
public static void main(String[] args) {
try{
DefaultAcsClient vodClient = initVodClient(accessKeyId, accessKeySecret);
UpdateVideoInfoResponse response = updateVideoInfo(vodClient);
System.out.println("RequestId is:" + response.getRequestId());
}catch (Exception e){
}
}
public static UpdateVideoInfoResponse updateVideoInfo(DefaultAcsClient vodClient) throws ClientException {
UpdateVideoInfoRequest request = new UpdateVideoInfoRequest();
request.setVideoId("a42b***********33b79f0102");
// 先頭フレームのサムネイルを設定する場合、`CoverURL` を先頭フレームのスナップショットジョブが成功した後に出力される画像 URL に設定します。
request.setCoverURL("http://demo.aliyuncdn.com/a42bf5******40b1b37/snapshots/normal/41B7AF54-18672BB301D-1748-0984-309-112420****.jpg");
return vodClient.getAcsResponse(request);
}
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
// ApsaraVideo for VOD が有効化されているリージョン。
String regionId = "cn-shanghai";
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
}
完全な例
package com.alibaba.bltest.transcode;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.*;
import org.apache.commons.lang3.StringUtils;
/**
* 注:
* 1. このデモは、スナップショットの取得とサムネイルの更新の完全なロジックを示します。コードの一部をビジネスロジックに合わせて調整する必要があります。
* 2. このデモは直接実行できません。必要なロジックを追加する必要があります。
* 3. このデモは参照用であり、唯一の実装方法を示すものではありません。
*/
public class SnapshotAndUpdateCover {
// Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。API 操作の呼び出しや日常の O&M (運用と保守) には、RAM ユーザーの使用を推奨します。
// プロジェクトに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングした場合、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが損なわれる恐れがあります。
// この例では、環境変数を使用して認証用の AccessKey ペアを取得する方法を示します。コードを実行する前に、ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数を設定してください。
public static String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
public static String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
public static void main(String[] args) {
try{
DefaultAcsClient vodClient = initVodClient(accessKeyId, accessKeySecret);
// ビデオ ID
String videoId = "a42bf540b1b37*******b79f0102";
// シナリオ 1:コールバックサービスがあるか、Message Service (MNS) を使用している場合。
// 新しくアップロードしたビデオのサムネイルを設定する場合、まずビデオ分析成功イベントを受信する必要があります。
// 既存のビデオのサムネイルを設定する場合、このステップから直接スナップショットジョブを送信できます。
submitSnapshotJob(vodClient,videoId);
// `SnapshotComplete` イベントコールバックを受信した後、スナップショットタイプを判断し、必要な画像 URL を取得します。
JSONObject callBackMessage = new JSONObject(); // これをコールバックサービスで受信したメッセージに置き換えます。
String snapshotType = callBackMessage.getJSONObject("UserData").getJSONObject("Extend").getString("SnapshotType");
if("FirstFrame".equals(snapshotType)){
// ここのスナップショットパスのロジックをカスタムロジックに置き換えます。
String coverUrl = callBackMessage.getJSONArray("SnapshotInfos").getJSONObject(0).getString("SnapshotRegular").replace("{SnapshotCount}","00001");
// ビデオサムネイルを更新します。
updateVideoInfo(vodClient,videoId,coverUrl);
}
// シナリオ 2:コールバックサービスがないか、MNS を使用していない場合。
// 新しくアップロードしたビデオのサムネイルを設定する場合、アップロード後にビデオのステータスをポーリングします。
String videoStatus = "";
while(!"Normal".equals(videoStatus)){
videoStatus = getVideoInfo(vodClient,videoId);
Thread.sleep(1000);
}
// 既存のビデオのサムネイルを設定する場合、このステップから直接スナップショットジョブを送信できます。
submitSnapshotJob(vodClient,videoId);
// スナップショットの結果をポーリングします。
String coverUrl = "";
while(StringUtils.isBlank(coverUrl)){
coverUrl = listSnapshots(vodClient,videoId);
Thread.sleep(1000);
}
// ビデオサムネイルを更新します。
updateVideoInfo(vodClient,videoId,coverUrl);
}catch (Exception e){
}
}
/**
* スナップショットジョブを送信します。
*/
public static SubmitSnapshotJobResponse submitSnapshotJob(DefaultAcsClient vodClient, String vid) throws ClientException {
SubmitSnapshotJobRequest request = new SubmitSnapshotJobRequest();
request.setVideoId(vid);
request.setSnapshotTemplateId("1f27a7f*********70eba2756");
// (オプション) コールバックで利用可能なカスタムパススルーパラメーターです。これを使用して、先頭フレームのスナップショットを識別できます。
request.setUserData("{\"Extend\":{\"SnapshotType\":\"FirstFrame\",\"VideoId\":\"a42bf540********33b79f0102\"}}");
return vodClient.getAcsResponse(request);
}
/**
* ビデオサムネイルを更新します。
*/
public static UpdateVideoInfoResponse updateVideoInfo(DefaultAcsClient vodClient, String vid, String coverUrl) throws ClientException {
UpdateVideoInfoRequest request = new UpdateVideoInfoRequest();
request.setVideoId(vid);
// 先頭フレームのサムネイルを設定する場合、`CoverURL` を先頭フレームのスナップショットジョブが成功した後に出力される画像 URL に設定します。
request.setCoverURL(coverUrl);
return vodClient.getAcsResponse(request);
}
/**
* SDK インスタンスを初期化します。
*/
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
// ApsaraVideo for VOD が有効化されているリージョン。
String regionId = "cn-shanghai";
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
/**
* スナップショットを照会します。
*/
public static String listSnapshots(DefaultAcsClient vodClient, String vid) throws ClientException {
ListSnapshotsRequest request = new ListSnapshotsRequest();
request.setVideoId(vid);
request.setSnapshotType("NormalSnapshot");
ListSnapshotsResponse response = vodClient.getAcsResponse(request);
String coverUrl = "";
System.out.println("RequestId is:" + response.getRequestId());
try{
coverUrl = response.getMediaSnapshot().getSnapshots().get(0).getUrl();
System.out.println("SnapshotUrl is:" + response.getMediaSnapshot().getSnapshots().get(0).getUrl());
}catch (NullPointerException e){
}
return coverUrl;
}
/**
* 単一のビデオを照会します。
*/
public static String getVideoInfo(DefaultAcsClient vodClient, String vid) throws ClientException {
GetVideoInfoRequest request = new GetVideoInfoRequest();
request.setVideoId(vid);
GetVideoInfoResponse response = vodClient.getAcsResponse(request);
System.out.println("RequestId is:" + response.getRequestId());
String videoStatus = "";
try{
videoStatus = response.getVideo().getStatus();
System.out.println("Video Status is:" + response.getVideo().getStatus());
}catch (NullPointerException e){
}
return videoStatus;
}
}