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 API を呼び出し、CoverURL を渡してサムネイル URL を指定します。
-
UpdateVideoInfos API を呼び出し、UpdateContent 内の CoverURL でサムネイル URL を指定します。
-
動画が ApsaraVideo for VOD に登録されている独自の OSS バケットにある場合は、RegisterMedia API を呼び出し、RegisterMetadata 内の CoverURL でサムネイル URL を指定します。
スマートサムネイルの設定
スマートサムネイル機能は、動画のコンテンツ、視覚的な美しさ、および膨大な制作データを分析して最適なキーフレームまたはセグメントを選択し、クリック率とユーザーエクスペリエンスを向上させます。
説明
ApsaraVideo for VOD は、静的およびアニメーション形式のサムネイル画像をサポートしています。動画形式のサムネイルには対応していません。
例:最初のフレームをサムネイルとして設定
手順の概要
-
スナップショットテンプレートを作成して、動画の最初のフレームをキャプチャします。
-
スナップショットジョブを送信して、最初のフレームをキャプチャします。
-
キャプチャした最初のフレームのスナップショットを、動画のサムネイルとして設定します。
操作手順
コンソール
-
スナップショットテンプレートを作成して、最初のフレームをキャプチャします。
-
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操作に対する権限を持っています。RAM ユーザーを使用してAPI操作を呼び出すか、日常の運用保守を実行することを推奨します。
// プロジェクトに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングすると、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが損なわれる可能性があります。
// この例では、環境変数を使用して AccessKey ペアを取得し、ID 検証を行う方法を示します。コードを実行する前に、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` イベントが成功した後にこの手順を実行することを推奨します。ステータスが「正常」の既存の動画については、独自のプロセスを設計できます。
* 3. スナップショットは非同期タスクです。スナップショット URL を取得する前に、`SnapshotComplete` イベントが成功するのを待つことを推奨します。
* 4. イベントコールバックの `SnapshotRegular` からスナップショットの出力 URL を推測できます。URL 生成ルールに関する詳細については、`SnapshotComplete` のトピックをご参照ください。
* 5. コールバックサービスがない場合は、`ListSnapshots` API を呼び出して結果をポーリングすることもできます。この操作は、デフォルトで最新のスナップショット結果のみを返します。詳細については、`ListSnapshots` API リファレンスをご参照ください。
*/
public class SubmitSnapshotJob {
// Alibaba CloudアカウントのAccessKeyペアは、すべてのAPI操作に対する権限を持っています。RAM ユーザーを使用してAPI操作を呼び出すか、日常の運用保守を実行することを推奨します。
// プロジェクトに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングすると、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが損なわれる可能性があります。
// この例では、環境変数を使用して AccessKey ペアを取得し、ID 検証を行う方法を示します。コードを実行する前に、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 vodClient.getAcsResponse(request);
}
}
-
動画サムネイルを最初のフレームのスナップショットに設定します。
この例では、アップロード後に単一の動画のサムネイルを変更します。その他の方法:動画アップロード時のサムネイル設定および動画アップロード後のサムネイル更新。
UpdateVideoInfo API を呼び出し、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操作に対する権限を持っています。RAM ユーザーを使用してAPI操作を呼び出すか、日常の運用保守を実行することを推奨します。
// プロジェクトに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングすると、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが損なわれる可能性があります。
// この例では、環境変数を使用して AccessKey ペアを取得し、ID 検証を行う方法を示します。コードを実行する前に、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操作に対する権限を持っています。RAM ユーザーを使用してAPI操作を呼び出すか、日常の運用保守を実行することを推奨します。
// プロジェクトに AccessKey ID と AccessKey Secret をハードコーディングしないでください。ハードコーディングすると、AccessKey ペアが漏洩し、すべてのリソースのセキュリティが損なわれる可能性があります。
// この例では、環境変数を使用して AccessKey ペアを取得し、ID 検証を行う方法を示します。コードを実行する前に、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;
}
}