すべてのプロダクト
Search
ドキュメントセンター

ApsaraVideo VOD:ビデオサムネイルの設定

最終更新日:Jan 20, 2026

ApsaraVideo VOD にビデオをアップロードする際に、ビデオサムネイルとして使用する画像を指定できます。サムネイルを指定しない場合、ApsaraVideo VOD は自動的にスナップショットをキャプチャしてサムネイルとして使用します。ビデオのアップロード後にサムネイルを更新することもできます。

概要

ApsaraVideo VOD にアップロードされたすべてのビデオにはサムネイルがあります。

ビデオのアップロード時にサムネイルを指定すると、アップロード完了後に指定した画像がビデオサムネイルとして使用されます。サムネイルを指定しない場合、ApsaraVideo VOD はデフォルトでビデオのスナップショットを 1〜8 枚キャプチャし、中央のスナップショットをサムネイルとして選択します。詳細については、「ビデオスナップショット」をご参照ください。ビデオのアップロード後にサムネイルを更新することもできます。

ApsaraVideo VOD は、標準サムネイルとスマートサムネイルをサポートしています。スマートサムネイル機能を利用するには、アクセスを申請する必要があります。詳細については、スマートサムネイル製品ページをご参照ください。

  • 標準サムネイル:カスタムのビデオサムネイルを指定できます。サムネイルには、ローカル画像、ビデオスナップショット、またはアクセス可能な URL の画像を使用できます。サムネイルは、静止画、アニメーション画像、またはビデオクリップにすることができます。

  • スマートサムネイル:システムがビデオのコンテンツと美観を分析し、最適なキーフレームまたはクリップを選択してビデオサムネイルとして使用します。サムネイルはビデオ自体から抽出されます。静止画とアニメーション画像がサポートされています。

シナリオ

サポートされるサムネイルタイプ

サポートされるメソッド

リファレンス

ビデオアップロード時のサムネイル設定

標準サムネイル

OpenAPI

ビデオアップロード時のサムネイル設定

ビデオアップロード後のサムネイル更新

標準サムネイル

  • コンソール

  • OpenAPI

ビデオアップロード後のサムネイル更新

スマートサムネイル

OpenAPI

前提条件

  • ApsaraVideo VOD がアクティベートされていること。詳細については、「ApsaraVideo VOD のアクティベート」をご参照ください。

  • アカウントとリソースを保護するため、Resource Access Management (RAM) ユーザーまたは RAM ロールを使用して操作を実行してください。RAM ユーザーまたは RAM ロールに ApsaraVideo VOD の必要な権限が付与されていることを確認してください。詳細については、「RAM ユーザーの作成と権限付与」をご参照ください。

  • ApsaraVideo VOD の高速化ドメイン名を設定している場合、サムネイルを設定する前にドメイン名の証明書を設定する必要があります。詳細については、「HTTPS セキュアアクセラレーション」をご参照ください。

ビデオアップロード時のサムネイル設定

ApsaraVideo VOD は、ビデオをアップロードするための複数のメソッドを提供しています。詳細については、「アップロードメソッド」をご参照ください。ビデオサムネイルは、API またはソフトウェア開発キット (SDK) を使用してビデオをアップロードする場合にのみ指定できます。パラメーターは次のとおりです:

重要

CoverURL には任意の URL を設定できます。ApsaraVideo VOD は URL を処理しません。ApsaraVideo VOD は URL を保存し、リクエストに応じて返します。CoverURL がアクセス可能であることを確認する必要があります。

  • CreateUploadVideo 操作を呼び出す際に、CoverURL (カスタムビデオサムネイル URL) パラメーターを渡してビデオサムネイルを指定できます。

  • UploadMediaByURL 操作を呼び出す際に、`UploadMetadata` の `CoverURL` (カスタムビデオサムネイル URL) パラメーターを渡してビデオサムネイルを指定できます。

ビデオアップロード後のサムネイル更新

ビデオが ApsaraVideo VOD にアップロードされた後、次のメソッドを使用してサムネイルを更新できます。

標準サムネイルの設定

コンソールを使用

ビデオが ApsaraVideo VOD にアップロードされた後、ApsaraVideo VOD コンソールでサムネイルを更新できます。ローカル画像またはビデオスナップショットをサムネイルとして使用できます。

  1. ApsaraVideo VOD コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[メディアファイル] > [オーディオ/ビデオ] を選択します。

  3. サムネイルを更新したいビデオを見つけ、管理 をクリックします。

  4. 基本情報 タブで、動画情報の編集 をクリックします。

    • 自動生成されたスナップショットの 1 つを選択して、ビデオサムネイルとして使用します。

    • または、アップロード をクリックし、ローカル画像を選択してビデオサムネイルとして使用します。

      説明

      アップロードするサムネイル画像は JPG または PNG 形式である必要があります。画像のサイズは 1 MB、解像度は 1920 × 1080 ピクセルを超えることはできません。

      设置智能封面2

  5. 保存 をクリックします。

    設定が完了したら、オーディオ/ビデオのリストページに戻り、サムネイルが更新されたことを確認できます。

OpenAPI を使用

ビデオが ApsaraVideo VOD にアップロードされた後、次の操作を呼び出してビデオサムネイルを更新できます。アクセス可能な任意の URL をビデオサムネイルとして設定できます。

重要

CoverURL には任意の URL を設定できます。ApsaraVideo VOD は URL を処理しません。ApsaraVideo VOD は URL を保存し、リクエストに応じて返します。CoverURL がアクセス可能であることを確認する必要があります。

  • UpdateVideoInfo 操作を呼び出し、CoverURL (カスタムビデオサムネイル URL) パラメーターを渡してビデオサムネイルを指定します。

  • UpdateVideoInfos 操作を呼び出し、UpdateContentCoverURL (カスタムビデオサムネイル URL) パラメーターを渡してビデオサムネイルを指定します。

  • ビデオがご自身の Object Storage Service (OSS) バケットに保存されており、そのバケットを ApsaraVideo VOD に登録している場合は、RegisterMedia 操作を呼び出します。メディアアセットを登録する際に、RegisterMetadataCoverURL (カスタムビデオサムネイル URL) パラメーターを渡してビデオサムネイルを指定します。

スマートサムネイルの設定

スマートサムネイル機能は、ビデオのコンテンツ、美観、および大規模な制作データを分析して、最適なキーフレームまたはクリップを選択し、ビデオサムネイルとして使用します。これにより、クリックスルーコンバージョン率とユーザーエクスペリエンスが向上します。

説明

現在、ApsaraVideo VOD はサムネイルとして静止画とアニメーション画像をサポートしていますが、ビデオクリップはサポートしていません。

  • 体験

    Retina - ApsaraVideo Multimedia AI 体験センターにアクセスして、この機能を試すことができます。

  • アクティベーション

    スマートサムネイル製品ページにアクセスして、この機能のアクティベーションを申請します。

  • 使用方法

    1. AddAITemplate 操作を呼び出します。`TemplateType` パラメーターを AIImage に設定し、必要に応じて他のパラメーターをカスタマイズして、スマートサムネイルテンプレートを作成します。

    2. SubmitAIImageJob 操作を呼び出します。`AITemplateId` パラメーターを前のステップで作成したスマートサムネイルテンプレートの ID に設定します。必要に応じて他のパラメーターをカスタマイズして、スマートサムネイルジョブを開始します。

例:最初のフレームのスナップショットをビデオサムネイルとして設定

設定フロー

  1. ビデオの最初のフレームをキャプチャするためのスナップショットテンプレートを作成します。

  2. スナップショットジョブを開始して、ビデオの最初のフレームをキャプチャします。

  3. ビデオサムネイルを最初のフレームのスナップショットに変更します。

設定方法

コンソールを使用した設定

  1. ビデオの最初のフレームをキャプチャするためのスナップショットテンプレートを作成します。

    1. ApsaraVideo VOD コンソールにログインします。

    2. 左側のナビゲーションウィンドウで、[設定管理] > [メディア処理] > [スナップショットテンプレート] を選択します。

    3. スナップショットテンプレートの追加 をクリックし、最初のフレームのスナップショットテンプレートのパラメーターを設定します。

      テンプレート名 をカスタム名に、スクリーンショットの方法通常のスクリーンショット に設定します。開始時間 を 00:00:00 に、スクリーンショットの数: を 1 に設定します。必要に応じて他のパラメーターを設定できます。スナップショットテンプレートのパラメーターの詳細については、「スナップショットテンプレート」をご参照ください。首帧截图1.png

    4. 保存 をクリックしてスナップショットテンプレートを作成します。

  2. スナップショットジョブを開始して、ビデオの最初のフレームをキャプチャします。

    説明
    • コンソールでスナップショットジョブを開始するには、ワークフローが必要です。まず、動画スクリーンショット ノードを含むワークフローを作成します。次に、スナップショットテンプレートを最初のフレームのスナップショットテンプレートに設定します。ワークフローの作成方法の詳細については、「ワークフロー管理」をご参照ください。

    • スナップショットジョブを開始する前に、ApsaraVideo VOD のイベント通知を設定します。SnapshotComplete イベントの通知を設定します。これにより、ジョブの完了後にジョブのステータスとスナップショットの URL を取得できます。イベント通知の設定方法の詳細については、「コールバック設定」をご参照ください。

    • シナリオ 1:ビデオアップロード中にスナップショットをキャプチャする

      1. ApsaraVideo VOD コンソールの左側のナビゲーションウィンドウで、メディアファイル > オーディオ/ビデオ を選択します。

      2. [オーディオ/ビデオのアップロード] をクリックし、次に [オーディオ/ビデオの追加] をクリックします。

      3. アップロード方法とストレージの場所を設定し、ビデオを追加します。次に、ワークフローでの処理 を選択し、最初のフレームのスナップショットジョブを含む事前に作成されたワークフローを選択します。

      4. アップロード をクリックします。

    • シナリオ 2:ビデオアップロード後にスナップショットをキャプチャする

      1. ApsaraVideo VOD コンソールの左側のナビゲーションウィンドウで、メディアファイル > オーディオ/ビデオ を選択します。

      2. [オーディオとビデオ] ページで、対象のビデオの行にある ApsaraVideo Media Processing をクリックします。

      3. 処理タイプワークフローでの処理 に設定します。ワークフロー パラメーターには、最初のフレームのスナップショットジョブを含む事前に作成されたワークフローを選択します。

      4. OK をクリックします。

    • スナップショット結果の取得

      • ApsaraVideo VOD で SnapshotComplete イベントのイベント通知を設定している場合、コールバックイベントからジョブのステータスとスナップショットの URL を取得できます。

      • イベント通知を設定していない場合は、ポーリングを使用して ListSnapshots 操作を呼び出し、ジョブのステータスとスナップショットの URL をクエリできます。

  3. ビデオサムネイルを最初のフレームのスナップショットに変更します。

    説明

    コンソールを使用してビデオサムネイルを変更できるのは、ビデオがアップロードされた後のみです。まず、前のステップで取得した最初のフレームのスナップショットをローカルコンピューターに保存して、アップロードの準備をします。

    1. ApsaraVideo VOD コンソールの左側のナビゲーションウィンドウで、メディアファイル > オーディオ/ビデオ を選択します。

    2. [オーディオとビデオのリスト] ページで、対象のビデオの行にある 管理 をクリックします。

    3. 基本情報 タブで、動画情報の編集 をクリックします。

    4. アップロード をクリックし、コンピューターから最初のフレームのスナップショットを選択して、[開く] をクリックします。

    5. 保存 をクリックしてビデオサムネイルを設定します。

      設定が完了したら、オーディオ/ビデオのリストページでサムネイルが更新されたことを確認できます。

OpenAPI を使用した設定

説明

このトピックでは、Alibaba Cloud SDK for Java を例として、ApsaraVideo VOD の OpenAPI 操作を呼び出す方法を説明します。

手順

  1. ビデオの最初のフレームをキャプチャするためのスナップショットテンプレートを作成します。

    AddVodTemplate 操作を呼び出して、最初のフレームをキャプチャするためのスナップショットテンプレートを作成します。次のサンプルコードは、操作の呼び出し方法を示しています:

    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. このデモは、最初のフレームのスナップショットテンプレートを作成する方法を示しています。出力は 1 つの画像です。
     * 2. ApsaraVideo VOD コンソールでスナップショットテンプレートを作成する方が便利です。
     */
    public class AddSnapshotTemplate {
    
        // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。RAM ユーザーを使用して API 操作を呼び出すか、日常の O&M を実行してください。
        // 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("FirstFrameSnapshotTemplate");
            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 VOD がアクティベートされているリージョン。
            String regionId = "cn-shanghai";  
            DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(profile);
    
            return client;
        }
    }
    
  2. スナップショットジョブを開始して、ビデオの最初のフレームをキャプチャします。

    SubmitSnapshotJob 操作を呼び出してスナップショットジョブを開始します。次のサンプルコードは、操作の呼び出し方法を示しています:

    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.vod.model.v20170321.*;
    
    /**
     * 説明:
     * 1. このデモは、最初のフレームのスナップショットテンプレートを作成した後に、最初のフレームのスナップショットジョブを送信する方法を示しています。
     * 2. 新しくアップロードされたビデオの場合、MediaProcessFinished イベントが成功した後にこのステップを実行します。通常状態の既存のビデオについては、独自のプロセスを設計してください。
     * 3. スナップショット作成は非同期タスクです。SnapshotComplete イベントが成功するのを待って、スナップショット URL を取得します。
     * 4. コールバックイベントの SnapshotRegular パラメーターからスナップショットの出力 URL を推測できます。詳細については、SnapshotComplete トピックのスナップショット URL 生成ルールをご参照ください。
     * 5. コールバックサービスがない場合は、ListSnapshots 操作を呼び出して結果をクエリすることもできます。デフォルトでは、この操作は最新のスナップショット結果のみを返します。詳細については、ListSnapshots トピックをご参照ください。
     */
    public class SubmitSnapshotJob {
    
        // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。RAM ユーザーを使用して API 操作を呼び出すか、日常の O&M を実行してください。
        // 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 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);
        }
    
    }
    
  3. ビデオサムネイルを最初のフレームのスナップショットに変更します。

    このセクションでは、アップロード後に単一のビデオのサムネイルを変更する方法の例を示します。他のシナリオの詳細については、「ビデオアップロード時のサムネイル設定」および「ビデオアップロード後のサムネイル更新」をご参照ください。

    UpdateVideoInfo 操作を呼び出し、CoverURL パラメーターを渡してビデオサムネイルを指定します。次のサンプルコードは、操作の呼び出し方法を示しています:

    package com.alibaba.cloud.test.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 トピックをご参照ください。
     * 2. サムネイルを変更する際は、使用する画像 URL が有効であることを確認してください。
     */
    public class UpdateVideoInfo {
    
        // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。RAM ユーザーを使用して API 操作を呼び出すか、日常の O&M を実行してください。
        // 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 VOD がアクティベートされているリージョン。
            String regionId = "cn-shanghai";  
            DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(profile);
            return client;
        }
    }
    

完全な例

package com.alibaba.cloud.test.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 操作を呼び出すか、日常の O&M を実行してください。
    // 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: コールバックサービスまたは MNS がある場合。
            // 新しくアップロードされたビデオのサムネイルを設定する場合、まずメディア分析成功イベントを取得する必要があります。
            // 既存のビデオのサムネイルを設定する場合、このステップからスナップショットジョブの送信を開始できます。
            submitSnapshotJob(vodClient,videoId);

            // ビデオスナップショット成功イベントを取得し、スナップショットタイプを決定し、必要な画像 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 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;
    }
}