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

ApsaraVideo VOD:ApsaraVideo Playerを使用してフルスクリーンモードでインスタント読み込みを実行する

最終更新日:Oct 29, 2024

ApsaraVideo Player SDKのプリロードやビデオサムネイルなどの機能を使用して、起動時間をミリ秒に短縮できます。 これにより、短いビデオ再生中に発生する可能性のある長い起動時間やビデオの途切れなどの問題が解決されます。 これはまた、知覚できないローディング経験を提供し、スムーズな再生を保証します。 このトピックでは、ApsaraVideo Playerを使用してフルスクリーンモードでインスタント読み込みを実行する方法について説明します。

ソリューションの概要

ビデオを再生すると、読み込みに時間がかかるため、黒い画面が表示されることがあります。 起動時間を短縮するために、ApsaraVideo Playerのプリロード機能を有効にしてビデオリソースをプリロードできます。 ビデオサムネイルを指定して、ビデオコンテンツが読み込まれる前にサムネイルを表示することもできます。 これは黒いスクリーンを防ぎます。 ビデオの最初のフレームをサムネイルとして設定すると、ビデオが実際に再生される前に最初のフレームが表示されます。 これは、迅速かつシームレスな再生体験を提供します。

このソリューションを使用すると、Wi-Fi環境での平均起動時間を約300ミリ秒に短縮できます。

制限事項

  • AndroidおよびiOS用のApsaraVideo Player SDKのみが、フルスクリーンモードでのインスタント読み込みをサポートしています。

  • 一度にプリロードできるMP4、MP3、FLV、またはHLSファイルは1つだけです。

  • プリロードされたビデオは、UrlSourceを使用してのみ再生できます。 VidAuthまたはVidStsを使用してプリロードされたビデオを再生することはできません。

前提条件

手順1: ApsaraVideo Player SDKでのプリロード機能の有効化

ApsaraVideo Player SDKでプリロード機能を有効にすると、事前にビデオデータがローカルデバイスに読み込まれます。 これにより、起動時間が短縮されます。

制限事項

  • 一度にプリロードできるMP4、MP3、FLV、またはHLSファイルは1つだけです。

  • URLに基づいて再生されるビデオのみをプリロードできます。 VidAuthまたはVidStsを使用して再生するビデオをプリロードすることはできません。

ApsaraVideo Player SDK for Androidの設定

  1. ローカルキャッシュ機能を有効にします。

    /app/src/main/java/com/aliyun/alivcsolution/MutiApplication.javaファイルでAliPlayerGlobalSettings.enableLocalCacheを呼び出して、ローカルキャッシュ機能を有効にします。

    public class MutiApplication extends Application {
    
        @Override
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            MultiDex.install(this);
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            // Enable the local caching feature. The path that the cache is stored must be an absolute path. Example: /tmp. The maxBufferMemoryKB parameter in the following sample code is deprecated in ApsaraVideo Player SDK V5.4.7.1 and later and does not take effect.
            AliPlayerGlobalSettings.enableLocalCache(true,10240,"/tmp");
    
          
        }
    
    }
  2. プリロードインスタンスを作成します。 インスタンスの初期化中にプリロードステータスのコールバックを設定します。

    /AliyunListPlayer/src/main/java/com/aliyun/player/aliyunlistplayer/AliyunListPlayerActivity.javaファイルにプリフェッチインスタンスを作成します。

    public class AliyunListPlayerActivity extends AppCompatActivity {
    
        private AliyunListPlayerView mListPlayerView;
        private NetWatchdog mNetWatchDog;
        private String mUserToken;
        private boolean mIsLoadMore = false;
        private int mLastVideoId = -1;
        private ImageView mBackImageView;
        
        // Create a preload instance.
        private MediaLoader medialoader=MediaLoader.getInstance();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_aliyun_list_player);
            mUserToken = getIntent().getStringExtra("list_player_user_token");
    
            initView();
            initSts(true);
            initListener();
    
    
            // Configure a callback for the prefetch status.
            medialoader.setOnLoadStatusListener(new MediaLoader.OnLoadStatusListener() {
                @Override
                public void onError(String url, int code, String msg) {
                    // Listen for a loading error.
                }
    
                @Override
                public void onCompleted(String s) {
                    // Listen for the end of loading.
                }
    
                @Override
                public void onCanceled(String s) {
                    // Listen for the cancellation of loading.
                }
            });
        }
        ...
  3. load関数を呼び出して、指定したディスクパスにデータをプリロードして格納します。

    private void getDatas(int id){
            GetVideoInfomation getVideoInfomation = new GetVideoInfomation();
            getVideoInfomation.getListPlayerVideoInfos(this, "1", mUserToken, id, new GetVideoInfomation.OnGetListPlayerVideoInfosListener() {
                private SparseArray<String> mSparseArray;
                @Override
                public void onGetSuccess(Request request, String result) {
                    // The demo list player uses only video IDs to request video data.
                    // You can preload videos only by using URLs. You cannot use video IDs to preload video data.
                    // The following sample code provides an example on how to preload videos based on URLs by using medialoader.
                    String url="";// Obtain the video URL.
                    medialoader.load(url,10000);// Save the preloaded data to the specified disk path. The loading time is set to 10,000 milliseconds.
    
                    Gson gson = new Gson();
                    AliyunVideoListBean aliyunVideoListBean = gson.fromJson(result, AliyunVideoListBean.class);
                    
                    ...

ApsaraVideo Player SDK for iOSの設定

  1. ローカルキャッシュ機能を有効にし、インスタンスの初期化中にプリロードステータスのコールバックを設定します。

    - (AliPlayer *)aliPlayer{
        if (!_aliPlayer && UIApplicationStateActive == [[UIApplication sharedApplication] applicationState]) {
            _aliPlayer = [[AliPlayer alloc] init];
            _aliPlayer.scalingMode =  AVP_SCALINGMODE_SCALEASPECTFIT;
            _aliPlayer.rate = 1;
            _aliPlayer.delegate = self;
            _aliPlayer.playerView = self.playerView;
    
            // Enable the local caching feature. The path that the cache is stored must be a sandbox path. The maxBufferMemoryKB parameter is deprecated in ApsaraVideo Player SDK V5.4.7.1 and later and does not take effect.
            NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
            [AliPlayerGlobalSettings enableLocalCache:YES maxBufferMemoryKB:10*1024 localCacheDir:[docDir stringByAppendingPathComponent:@"alivcCache"]];
            [AliPlayerGlobalSettings setCacheFileClearConfig:30*60*24 maxCapacityMB:20480 freeStorageMB:0];
            // Specify the callback methods.
            [AliPlayerGlobalSettings setCacheUrlHashCallback:hashCallback];
            
            // Configure a callback delegate to make sure that the preload URL and playback URL are the same. This prevents preload failures.
            [[AliMediaLoader shareInstance] setAliMediaLoaderStatusDelegate:self];
    
        }
        return _aliPlayer;
    }
    
    // Specify a callback method for video playback.
    NSString* hashCallback(NSString* url){
        NSString *md5Str = [NSString aliyun_MD5:url];
        return md5Str;
    }
    
    // Specify a callback method for video preload.
    #pragma mark -- AliMediaLoaderStatusDelegate
    /**
     @brief The callback that is invoked when an error occurs.
     @ param url The URL.
     @param code The error code.
     @ param msg The error description.
     */
    - (void)onError:(NSString *)url code:(int64_t)code msg:(NSString *)msg {
        
    }
    
    /**
     @ brief The callback that is invoked when the loading is complete.
     @ param url The URL.
     */
    - (void)onCompleted:(NSString *)url {
        
    }
    
    /**
     @ brief The callback that is invoked when the loading is canceled.
     @ param url The URL.
     */
    - (void)onCanceled:(NSString *)url {
        
    }

  2. 指定されたディスクパスにデータをプリロードするようにデータソースを設定するときは、load関数を呼び出します。

    NSString *urlString = @"<URL>";
    AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:urlString];
    [_aliPlayer setUrlSource:urlSource];
    [[AliMediaLoader shareInstance] load:urlString duration:10000];// Save the preloaded data to the specified disk path. The loading time is set to 10,000 milliseconds.

ステップ2: ビデオの最初のフレームをサムネイルとして設定する

動画の最初のフレームをサムネイルとして設定すると、すばやくシームレスに再生できるようになります。

説明

ApsaraVideo Playerを使用してリスト内のビデオを再生する場合、次のロジックを使用して、迅速な再生エクスペリエンスを提供し、トラフィックの使用量を減らすことができます。

  • ユーザーがビデオをすばやく切り替えると、ビデオサムネイルのみが要求されます。

  • プリフェッチされたビデオサムネイルは、次のビデオのビューの半分が表示されるときに表示されます。

ApsaraVideo VODコンソールの使用

  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. [ビデオとオーディオ] ページで、スナップショットをキャプチャするファイルを見つけ、[操作] 列の [メディア処理] をクリックします。

      3. [メディア処理] ダイアログボックスで、ビデオの最初のフレームをキャプチャするために作成したワークフローに対して、[処理タイプ][ワークフローの使用] および [ワークフロー] に設定します。

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

    • スナップショットタスクの結果を取得する

      • スナップショットタスクを作成する前にSnapshotCompleteイベント通知を設定すると、タスクの完了後にコールバックからタスクのステータスやスナップショットURLなどの情報を取得できます。

      • スナップショットタスクを作成する前にSnapshotCompleteイベント通知を構成しない場合は、ラウンドロビン方式を使用してListSnapshots操作を呼び出し、タスクのステータスやスナップショットURLなどの情報を取得できます。

  3. ビデオサムネイルをビデオの最初のフレームに変更します。

    説明

    ApsaraVideo VODコンソールでビデオのサムネイルを変更できるのは、ビデオがアップロードされた後です。 ビデオの最初のフレームをサムネイルとして使用するには、ステップ2でキャプチャしたスナップショットをローカルデバイスに保存する必要があります。

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

    2. [ビデオとオーディオ] ページで、サムネイルを変更するビデオを見つけ、[操作] 列の [管理] をクリックします。

    3. [基本情報] タブで、[ビデオ情報の編集] をクリックします。

    4. 表示されるページで、[アップロード] をクリックし、ステップ2でローカルデバイスからキャプチャしたスナップショットを選択し、[開く] をクリックします。

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

      ビデオとオーディオのページで、ビデオのサムネイルが変更されているかどうかを確認できます。

ApsaraVideo VOD APIの使用

説明

次のセクションでは、API操作を呼び出してビデオのサムネイルを設定する方法とサンプルコードについて説明します。 ApsaraVideo VOD SDK for Javaを例として使用します。

手順

  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;
    
    
    /**
     * Note:
     * 1. The following sample code is used to create a snapshot template for capturing the first frame of a video and export an image. 
     * 2. We recommend that you create a snapshot template in the ApsaraVideo VOD console. 
     */
    public class AddSnapshotTemplate {
    
        // The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M. 
        // We recommend that you do not include your AccessKey pair (AccessKey ID and AccessKey secret) in your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources within your account may be compromised. 
        // In this example, ApsaraVideo VOD reads the AccessKey pair from the environment variables to implement identity verification for API access. Before you run the sample code, configure the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and 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 {
            // The region in which ApsaraVideo VOD is activated.
            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.*;
    
    /**
     * Note:
     * 1. The following sample code is used to create a snapshot task after you create a snapshot template for capturing the first frame of a video. 
     * 2. After you upload a video to ApsaraVideo VOD, you can create a snapshot task for the video only after the VideoAnalysisComplete event callback is returned. This is not required for existing videos that are in the normal state. 
     * 3. Snapshot tasks are asynchronously processed. We recommend that you query the snapshot URL after the SnapshotComplete event callback is returned. 
     * 4. You can obtain the output URL of the snapshot from the SnapshotRegular parameter in the callback. For more information, see the "Generation of snapshot URLs" section of the SnapshotComplete topic. 
     * 5. If you do not enable the callback feature, you can call the ListSnapshots operation to query the most recent snapshot information. For more information, see ListSnapshots. 
     */
    public class SubmitSnapshotJob {
    
        // The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M. 
        // We recommend that you do not include your AccessKey pair (AccessKey ID and AccessKey secret) in your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources within your account may be compromised. 
        // In this example, ApsaraVideo VOD reads the AccessKey pair from the environment variables to implement identity verification for API access. Before you run the sample code, configure the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and 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");
            // Optional. The custom pass-through parameters. This parameter is used to identify the snapshot of the first frame. You can use the parameter in event callbacks.
            request.setUserData("{\"Extend\":{\"SnapshotType\":\"FirstFrame\",\"VideoId\":\"a42bf540********33b79f0102\"}}");
            return vodClient.getAcsResponse(request);
        }
    
        public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
            // The region in which ApsaraVideo VOD is activated.
            String regionId = "cn-shanghai";  
            DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(profile);
    
            return client;
        }
    
        // Call the ListSnapshots operation to query snapshots.
        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.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;
    
    /**
     * Note:
     * 1. The following sample code is used to change the thumbnail of a video. For more information about how to modify other video parameters, see the documentation of the UpdateVideoInfo operation. 
     * 2. Make sure that the thumbnail URL that you specify is accessible. 
     */
    public class UpdateVideoInfo {
    
        // The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M. 
        // We recommend that you do not include your AccessKey pair (AccessKey ID and AccessKey secret) in your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources within your account may be compromised. 
        // In this example, ApsaraVideo VOD reads the AccessKey pair from the environment variables to implement identity verification for API access. Before you run the sample code, configure the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and 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");
            // Set CoverURL to the URL of the image that is generated by the snapshot task for capturing the first frame of the video.
            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 {
            // Specify the region in which ApsaraVideo VOD is activated.
            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;

/**
 * Note:
 * 1. The following sample code is used to capture a video snapshot and change the video thumbnail. You can modify the code based on your business requirements. 
 * 2. You must add specific logic to the following sample code before you can use the code. 
 * 3. The following sample code is for reference only. You can use other methods to capture a video snapshot and modify the video thumbnail. 
 */
public class SnapshotAndUpdateCover {

    // The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. We recommend that you use a RAM user to call API operations or perform routine O&M. 
    // We recommend that you do not include your AccessKey pair (AccessKey ID and AccessKey secret) in your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources within your account may be compromised. 
    // In this example, ApsaraVideo VOD reads the AccessKey pair from the environment variables to implement identity verification for API access. Before you run the sample code, configure the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and 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);
            // The video ID.
            String videoId = "a42bf540b1b37*******b79f0102";

            // Scenario 1: The callback feature is enabled or Message Service (MNS) is activated
            // You can set the thumbnail of a newly uploaded video only after the VideoAnalysisComplete callback is returned.
            // To set the thumbnail of an existing video, call the submitSnapshotJob operation.
            submitSnapshotJob(vodClient,videoId);

            // After the SnapshotComplete callback is returned, obtain the snapshot type and the snapshot URL.
            JSONObject callBackMessage = new JSONObject();  // Specify the callback message.
            String snapshotType = callBackMessage.getJSONObject("UserData").getJSONObject("Extend").getString("SnapshotType");
            if("FirstFrame".equals(snapshotType)){

                // Specify the path in which the snapshot is stored based on your business requirements.
                String coverUrl = callBackMessage.getJSONArray("SnapshotInfos").getJSONObject(0).getString("SnapshotRegular").replace("{SnapshotCount}","00001");
                // Change the video thumbnail.
                updateVideoInfo(vodClient,videoId,coverUrl);
            }

            // Scenario 2: The callback feature is not enabled and MNS is not activated
            // To set the thumbnail of a newly uploaded video, use the round-robin method to obtain the video status.
            String videoStatus = "";
            while(!"Normal".equals(videoStatus)){
                videoStatus = getVideoInfo(vodClient,videoId);
                Thread.sleep(1000);
            }

            // To set the thumbnail of an existing video, call the submitSnapshotJob operation.
            submitSnapshotJob(vodClient,videoId);

            // Use the round-robin method to obtain the result of the snapshot task.
            String coverUrl = "";
            while(StringUtils.isBlank(coverUrl)){
                coverUrl = listSnapshots(vodClient,videoId);
                Thread.sleep(1000);
            }

            // Change the video thumbnail.
            updateVideoInfo(vodClient,videoId,coverUrl);
        }catch (Exception e){

        }
    }

    /**
     * Submit a snapshot task
     */
    public static SubmitSnapshotJobResponse submitSnapshotJob(DefaultAcsClient vodClient, String vid) throws ClientException {
        SubmitSnapshotJobRequest request = new SubmitSnapshotJobRequest();
        request.setVideoId(vid);
        request.setSnapshotTemplateId("1f27a7f*********70eba2756");
        // Optional. The custom pass-through parameters. This parameter is used to identify the snapshot of the first frame. You can use the parameter in event callbacks.
        request.setUserData("{\"Extend\":{\"SnapshotType\":\"FirstFrame\",\"VideoId\":\"a42bf540********33b79f0102\"}}");

        return vodClient.getAcsResponse(request);
    }

    /**
     * Change the video thumbnail
     */
    public static UpdateVideoInfoResponse updateVideoInfo(DefaultAcsClient vodClient, String vid, String coverUrl) throws ClientException {
        UpdateVideoInfoRequest request = new UpdateVideoInfoRequest();
        request.setVideoId(vid);
        // Set CoverURL to the URL of the image that is generated by the snapshot task for capturing the first frame of the video.
        request.setCoverURL(coverUrl);

        return vodClient.getAcsResponse(request);
    }

    /**
     * Initialize the SDK instance
     */
    public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
        // Specify the region in which ApsaraVideo VOD is activated.
        String regionId = "cn-shanghai";  
        DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
        DefaultAcsClient client = new DefaultAcsClient(profile);

        return client;
    }

    /**
     * Query the captured snapshots.
     */
    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;
    }

    /**
     * Query information about a video.
     */
    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;
    }
}

ステップ3: (オプション) ビデオリソースのプリフェッチ

プリフェッチ機能により、ApsaraVideo VODは配信元サーバーからビデオリソースをプリフェッチし、事前にAlibaba Cloud CDNポイントオブプレゼンス (POP) にキャッシュします。 このようにして、ユーザーはPOPから最新のリソースを取得することができます。 これにより、ビデオの再生が高速化され、ApsaraVideo Playerでのビデオプリロードが容易になります。

説明

更新およびプリフェッチ機能を使用すると、オリジントラフィックに対して課金されます。 ビデオの人気に基づいてプリフェッチ機能を使用できます。

ApsaraVideo VODコンソールの使用

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

  2. 左側のナビゲーションウィンドウで、[設定管理]> [CDN設定]> [更新とプリフェッチ] を選択します。

  3. [キャッシュの更新] タブで、プリフェッチ情報を設定します。

    • 操作をプリフェッチに設定します。

    • ObjectをURLに設定します。

    • URL: プリフェッチするビデオリソースのURLを入力します。 各URLはhttp:// またはhttps:// で始まる必要があります。 1日あたり最大500個のURLからリソースをプリフェッチできます。 リクエストには最大100個のURLを指定できます。

  4. [送信] をクリックします。

ApsaraVideo VOD APIの使用

  1. PreloadVodObjectCaches操作を呼び出して、ビデオリソースをプリフェッチします。

ステップ4: ApsaraVideo Playerを使用してビデオを再生

ApsaraVideo Playerを使用して、UrlSourceに基づいてビデオを再生します。