Anda dapat memanfaatkan fitur-fitur ApsaraVideo Player SDK, seperti preload dan gambar mini video, untuk mengurangi durasi startup hingga milidetik. Solusi ini mengatasi masalah umum pada pemutaran video pendek, seperti startup yang lama dan video tersendat, serta memberikan pengalaman pemuatan yang nyaris tak terasa dan pemutaran yang lancar. Topik ini menjelaskan cara menggunakan ApsaraVideo Player untuk mencapai pemuatan instan dalam mode layar penuh.
Ikhtisar solusi
Saat memutar video, layar hitam mungkin muncul karena proses pemuatan memerlukan waktu. Untuk mempercepat startup, Anda dapat mengaktifkan fitur preload di ApsaraVideo Player guna memuat sumber daya video terlebih dahulu. Selain itu, Anda dapat menentukan gambar mini video dan menampilkannya sebelum konten video dimuat, sehingga mencegah kemunculan layar hitam. Jika frame pertama video ditetapkan sebagai gambar mini, frame tersebut akan ditampilkan sebelum pemutaran dimulai, memberikan pengalaman pemutaran yang cepat dan mulus.
Dengan solusi ini, waktu startup rata-rata dapat dipersingkat menjadi sekitar 300 milidetik di lingkungan Wi-Fi.
Batasan
Hanya ApsaraVideo Player SDK untuk Android dan iOS yang mendukung pemuatan instan dalam mode layar penuh.
Anda hanya dapat melakukan preload satu file MP4, MP3, FLV, atau HLS dalam satu waktu.
Video yang telah dipreloads hanya dapat diputar menggunakan UrlSource. VidAuth atau VidSts tidak didukung untuk memutar video yang telah dipreloads.
Prasyarat
ApsaraVideo VOD telah diaktifkan. Untuk informasi selengkapnya, lihat Aktifkan ApsaraVideo VOD.
ApsaraVideo Player SDK telah diintegrasikan. Untuk informasi selengkapnya, lihat Integrasi cepat ApsaraVideo Player SDK untuk Android dan Integrasi cepat ApsaraVideo Player SDK untuk iOS.
Nama domain yang dipercepat harus dikonfigurasi terlebih dahulu sebelum Anda menggunakan fitur segarkan dan ambil awal di ApsaraVideo VOD. Untuk informasi selengkapnya, lihat Tambahkan nama domain untuk CDN.
Langkah 1: Aktifkan fitur preload di ApsaraVideo Player SDK
Setelah fitur preload diaktifkan di ApsaraVideo Player SDK, data video akan dimuat ke perangkat lokal terlebih dahulu, sehingga mengurangi waktu startup.
Batasan
Saat ini hanya mendukung pemuatan file media tunggal seperti MP4, MP3, FLV, dan HLS.
Konfigurasi pemutar Android
Aktifkan fitur caching lokal.
Untuk mengaktifkan caching lokal, panggil
AliPlayerGlobalSettings.enableLocalCachedi file/app/src/main/java/com/aliyun/alivcsolution/MutiApplication.java.public class MutiApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } @Override public void onCreate() { super.onCreate(); // Aktifkan fitur caching lokal. Jalur tempat cache disimpan harus berupa jalur mutlak. Contoh: /tmp. Parameter maxBufferMemoryKB pada kode contoh berikut sudah tidak digunakan lagi di ApsaraVideo Player SDK V5.4.7.1 dan versi setelahnya serta tidak berpengaruh. AliPlayerGlobalSettings.enableLocalCache(true,10240,"/tmp"); } }Buat instans preload dan konfigurasikan callback untuk status preload selama inisialisasi instans.
Hal ini didefinisikan di
/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; // Buat singleton untuk preload. 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(); // Tetapkan callback untuk status pemuatan. medialoader.setOnLoadStatusListener(new MediaLoader.OnLoadStatusListener() { @Override public void onError(String url, int code, String msg) { // Terjadi error selama pemuatan. } @Override public void onCompleted(String s) { // Pemuatan selesai. } @Override public void onCanceled(String s) { // Pemuatan dibatalkan. } }); } ...Saat merespons permintaan data, panggil fungsi
loaduntuk melakukan preload dan menyimpan data ke jalur disk yang ditentukan.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) { // Pemutar daftar demo hanya menggunakan ID video untuk meminta data video. // Namun, Anda hanya dapat melakukan preload video menggunakan URL, bukan ID video. // Kode berikut memberikan contoh cara menggunakan medialoader untuk melakukan preload video setelah Anda mendapatkan URL-nya. String url="";// Anggap Anda telah mendapatkan URL video. medialoader.load(url,10000);// Lakukan preload data dan simpan ke jalur disk yang ditentukan. Durasi pemuatan adalah 10.000 milidetik. Gson gson = new Gson(); AliyunVideoListBean aliyunVideoListBean = gson.fromJson(result, AliyunVideoListBean.class); ...
Konfigurasi ApsaraVideo Player SDK untuk iOS
Aktifkan fitur caching lokal dan konfigurasikan callback untuk status preload selama inisialisasi instans.
- (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; // Aktifkan caching lokal. Jalur file cache lokal harus berupa jalur sandbox. Parameter maxBufferMemoryKB sudah tidak digunakan lagi di v5.4.7.1 dan versi setelahnya serta tidak berpengaruh. 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]; // Tetapkan metode callback URL untuk mencegah kegagalan preload akibat ketidaksesuaian antara URL preload dan URL pemutaran karena perubahan parameter. [AliPlayerGlobalSettings setCacheUrlHashCallback:hashCallback]; // Tetapkan delegasi callback. [[AliMediaLoader shareInstance] setAliMediaLoaderStatusDelegate:self]; } return _aliPlayer; } // Metode callback URL. NSString* hashCallback(NSString* url){ NSString *md5Str = [NSString aliyun_MD5:url]; return md5Str; } // Metode callback untuk preload. #pragma mark -- AliMediaLoaderStatusDelegate /** @brief Callback error. @param url URL yang dimuat. @param code Kode error. @param msg Deskripsi error. */ - (void)onError:(NSString *)url code:(int64_t)code msg:(NSString *)msg { } /** @brief Callback penyelesaian. @param url URL yang telah dimuat. */ - (void)onCompleted:(NSString *)url { } /** @brief Callback pembatalan. @param url URL yang pemuatannya dibatalkan. */ - (void)onCanceled:(NSString *)url { }Panggil fungsi
loadsaat mengonfigurasi sumber data untuk melakukan preload data ke jalur disk yang ditentukan.NSString *urlString = @"<URL>"; AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:urlString]; [_aliPlayer setUrlSource:urlSource]; [[AliMediaLoader shareInstance] load:urlString duration:10000];// Simpan data yang telah dipreloads ke jalur disk yang ditentukan. Waktu pemuatan diatur menjadi 10.000 milidetik.
Langkah 2: Tetapkan frame pertama video sebagai gambar mini
Anda dapat menetapkan frame pertama video sebagai gambar mini untuk memberikan pengalaman pemutaran yang cepat dan mulus.
Jika Anda menggunakan ApsaraVideo Player untuk memutar video dalam daftar, terapkan logika berikut guna memberikan pengalaman pemutaran cepat dan mengurangi penggunaan trafik:
Hanya gambar mini video yang diminta saat pengguna beralih video dengan cepat.
Gambar mini video yang telah diambil awal ditampilkan saat separuh tampilan video berikutnya terlihat.
Konfigurasi menggunakan konsol
Buat templat snapshot untuk mengambil frame pertama video.
Masuk ke Konsol ApsaraVideo VOD.
Di panel navigasi sebelah kiri, pilih Configuration Management > Media Processing > Snapshot Templates.
Klik Create Snapshot Template dan konfigurasikan parameter templat snapshot frame pertama.
Tetapkan Template Name ke nama kustom dan Snapshot Type ke Normal Snapshot. Tetapkan Start Time ke 00:00:00 dan Snapshot Count: ke 1. Anda dapat mengonfigurasi parameter lain sesuai kebutuhan. Untuk informasi selengkapnya tentang parameter templat snapshot, lihat Templat snapshot.

Klik Save untuk membuat templat snapshot.
Jalankan pekerjaan snapshot untuk mengambil frame pertama video.
CatatanMenjalankan pekerjaan snapshot di konsol memerlukan alur kerja. Pertama, buat alur kerja yang mencakup node Snapshots. Lalu, tetapkan templat snapshot ke templat snapshot frame pertama. Untuk informasi selengkapnya tentang cara membuat alur kerja, lihat Manajemen alur kerja.
Sebelum menjalankan pekerjaan snapshot, konfigurasikan notifikasi event untuk ApsaraVideo VOD. Tetapkan notifikasi untuk event SnapshotComplete. Hal ini memungkinkan Anda mengambil status pekerjaan dan URL snapshot setelah pekerjaan selesai. Untuk informasi selengkapnya tentang cara mengonfigurasi notifikasi event, lihat Pengaturan callback.
Skenario 1: Ambil snapshot saat mengunggah video
Di Konsol ApsaraVideo VOD, di panel navigasi sebelah kiri, pilih Media Files > Audio/Video.
Klik Upload Audio/Video, lalu klik Add Audio/Video.
Tetapkan metode upload dan alamat penyimpanan, lalu tambahkan video. Kemudian, pilih Use Workflow dan pilih alur kerja yang telah dibuat sebelumnya yang mencakup pekerjaan snapshot frame pertama.
Klik Upload.
Skenario 2: Ambil snapshot setelah video diunggah
Di Konsol ApsaraVideo VOD, pilih Media Files > Audio/Video di panel navigasi sebelah kiri.
Di halaman Audio dan Video, klik Media Processing pada baris video target.
Atur Processing Type ke Use Workflow. Untuk parameter Workflows, pilih alur kerja yang telah dibuat sebelumnya dan mencakup pekerjaan snapshot frame pertama.
Klik OK.
Ambil hasil snapshot
Jika Anda telah mengonfigurasi notifikasi event untuk event SnapshotComplete di ApsaraVideo VOD, Anda dapat mengambil status pekerjaan dan URL snapshot dari event callback.
Jika belum mengonfigurasi notifikasi event, Anda dapat menggunakan polling untuk memanggil operasi ListSnapshots guna menanyakan status pekerjaan dan URL snapshot.
Ubah gambar mini video menjadi snapshot frame pertama.
CatatanAnda hanya dapat menggunakan konsol untuk mengubah gambar mini video setelah video diunggah. Simpan terlebih dahulu snapshot frame pertama yang diperoleh pada langkah sebelumnya ke komputer lokal sebagai persiapan untuk diunggah.
Di panel navigasi kiri Konsol ApsaraVideo VOD, pilih Media Files > Audio/Video.
Di halaman Daftar Audio dan Video, klik Manage pada baris video target.
Di tab Basic information, klik Editing Video Information .
Klik Upload, pilih snapshot frame pertama dari komputer Anda, lalu klik Open.
Klik Save untuk menetapkan gambar mini video.
Setelah konfigurasi selesai, Anda dapat memverifikasi bahwa gambar mini telah diperbarui di halaman daftar audio dan video.
Konfigurasi menggunakan OpenAPI
Topik ini menggunakan Alibaba Cloud SDK untuk Java sebagai contoh untuk menunjukkan cara memanggil operasi OpenAPI ApsaraVideo VOD.
Prosedur
Buat templat snapshot untuk mengambil frame pertama video.
Panggil operasi AddVodTemplate untuk membuat templat snapshot frame pertama. Kode contoh berikut menunjukkan cara memanggil operasi tersebut:
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; /** * Deskripsi: * 1. Demo ini menunjukkan cara membuat templat snapshot frame pertama. Outputnya adalah satu gambar. * 2. Membuat templat snapshot di Konsol ApsaraVideo VOD lebih mudah. */ public class AddSnapshotTemplate { // Pasangan Kunci Akses Akun Alibaba Cloud memiliki izin atas semua operasi API. Gunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin. // Jangan simpan ID AccessKey dan Rahasia AccessKey di kode proyek Anda. Jika tidak, pasangan Kunci Akses dapat bocor, yang mengancam keamanan semua resource dalam akun Anda. // Contoh ini menunjukkan cara membaca pasangan Kunci Akses dari variabel lingkungan untuk verifikasi identitas. Sebelum menjalankan kode contoh, konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan 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 { // Wilayah tempat ApsaraVideo VOD diaktifkan. String regionId = "cn-shanghai"; DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(profile); return client; } }Jalankan pekerjaan snapshot untuk mengambil frame pertama video.
Panggil operasi SubmitSnapshotJob untuk menjalankan pekerjaan snapshot. Kode contoh berikut menunjukkan cara memanggil operasi tersebut:
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.vod.model.v20170321.*; /** * Deskripsi: * 1. Demo ini menunjukkan cara mengirimkan pekerjaan snapshot frame pertama setelah Anda membuat templat snapshot frame pertama. * 2. Untuk video yang baru diunggah, lakukan langkah ini setelah event MediaProcessFinished berhasil. Untuk video yang sudah ada dalam status Normal, rancang proses Anda sendiri. * 3. Proses snapshot merupakan tugas asinkron. Tunggu hingga event SnapshotComplete berhasil untuk mendapatkan URL snapshot. * 4. Anda dapat menginferensi URL output snapshot dari parameter SnapshotRegular dalam event callback. Untuk informasi selengkapnya, lihat aturan pembuatan URL snapshot di topik SnapshotComplete. * 5. Jika Anda tidak memiliki layanan callback, Anda juga dapat memanggil operasi ListSnapshots untuk menanyakan hasilnya. Secara default, operasi ini hanya mengembalikan hasil snapshot terbaru. Untuk informasi selengkapnya, lihat topik ListSnapshots. */ public class SubmitSnapshotJob { // Pasangan Kunci Akses Akun Alibaba Cloud memiliki izin atas semua operasi API. Gunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin. // Jangan simpan ID AccessKey dan Rahasia AccessKey di kode proyek Anda. Jika tidak, pasangan Kunci Akses dapat bocor, yang mengancam keamanan semua resource dalam akun Anda. // Contoh ini menunjukkan cara membaca pasangan Kunci Akses dari variabel lingkungan untuk verifikasi identitas. Sebelum menjalankan kode contoh, konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan 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"); // Parameter pass-through kustom. Tersedia dalam callback dan bersifat opsional. Digunakan untuk membedakan snapshot frame pertama untuk gambar mini. request.setUserData("{\"Extend\":{\"SnapshotType\":\"FirstFrame\",\"VideoId\":\"a42bf540********33b79f0102\"}}"); return vodClient.getAcsResponse(request); } public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException { // Wilayah tempat ApsaraVideo VOD diaktifkan. String regionId = "cn-shanghai"; DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(profile); return client; } // ListSnapshots: Tanyakan snapshot 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); } }Ubah gambar mini video menjadi snapshot frame pertama.
Bagian ini memberikan contoh cara memodifikasi gambar mini video tunggal setelah diunggah. Untuk informasi selengkapnya tentang skenario lain, lihat Tetapkan gambar mini saat mengunggah video dan Perbarui gambar mini setelah video diunggah.
Panggil operasi UpdateVideoInfo dan teruskan parameter CoverURL untuk menentukan gambar mini video. Kode contoh berikut menunjukkan cara memanggil operasi tersebut:
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; /** * Deskripsi: * 1. Demo ini menunjukkan cara memodifikasi gambar mini video tunggal. Untuk memodifikasi parameter video lainnya, lihat topik UpdateVideoInfo. * 2. Saat memodifikasi gambar mini, pastikan URL gambar yang Anda gunakan valid. */ public class UpdateVideoInfo { // Pasangan Kunci Akses Akun Alibaba Cloud memiliki izin atas semua operasi API. Gunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin. // Jangan simpan ID AccessKey dan Rahasia AccessKey di kode proyek Anda. Jika tidak, pasangan Kunci Akses dapat bocor, yang mengancam keamanan semua resource dalam akun Anda. // Contoh ini menunjukkan cara membaca pasangan Kunci Akses dari variabel lingkungan untuk verifikasi identitas. Sebelum menjalankan kode contoh, konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan 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"); // Saat menetapkan gambar mini frame pertama, CoverURL adalah URL gambar yang dikembalikan setelah pekerjaan snapshot frame pertama berhasil. 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 { // Wilayah tempat ApsaraVideo VOD diaktifkan. String regionId = "cn-shanghai"; DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(profile); return client; } }
Contoh lengkap
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;
/**
* Deskripsi:
* 1. Demo ini menunjukkan logika lengkap untuk mengambil snapshot dan memodifikasi gambar mini. Anda perlu memodifikasi sebagian kode berdasarkan logika bisnis Anda.
* 2. Demo ini tidak dapat digunakan secara langsung. Anda perlu menambahkan beberapa logika sendiri.
* 3. Demo ini hanya sebagai referensi dan bukan satu-satunya metode implementasi.
*/
public class SnapshotAndUpdateCover {
// Pasangan Kunci Akses Akun Alibaba Cloud memiliki izin atas semua operasi API. Gunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin.
// Jangan simpan ID AccessKey dan Rahasia AccessKey di kode proyek Anda. Jika tidak, pasangan Kunci Akses dapat bocor, yang mengancam keamanan semua resource dalam akun Anda.
// Contoh ini menunjukkan cara membaca pasangan Kunci Akses dari variabel lingkungan untuk verifikasi identitas. Sebelum menjalankan kode contoh, konfigurasikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan 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 Video
String videoId = "a42bf540b1b37*******b79f0102";
// Skenario 1: Anda memiliki layanan callback atau MNS.
// Jika Anda menetapkan gambar mini untuk video yang baru diunggah, Anda harus terlebih dahulu mendapatkan event keberhasilan analisis media.
// Jika Anda menetapkan gambar mini untuk video yang sudah ada, Anda dapat mulai mengirimkan pekerjaan snapshot dari langkah ini.
submitSnapshotJob(vodClient,videoId);
// Dapatkan event keberhasilan snapshot video, tentukan jenis snapshot, dan ambil URL gambar yang diperlukan.
JSONObject callBackMessage = new JSONObject(); // Ganti ini dengan pesan yang diterima oleh layanan callback.
String snapshotType = callBackMessage.getJSONObject("UserData").getJSONObject("Extend").getString("SnapshotType");
if("FirstFrame".equals(snapshotType)){
// Logika jalur snapshot di sini perlu diganti dengan logika jalur snapshot kustom Anda.
String coverUrl = callBackMessage.getJSONArray("SnapshotInfos").getJSONObject(0).getString("SnapshotRegular").replace("{SnapshotCount}","00001");
// Modifikasi gambar mini video.
updateVideoInfo(vodClient,videoId,coverUrl);
}
// Skenario 2: Anda tidak memiliki layanan callback atau MNS.
// Jika Anda menetapkan gambar mini untuk video yang baru diunggah, polling status video setelah pengunggahan.
String videoStatus = "";
while(!"Normal".equals(videoStatus)){
videoStatus = getVideoInfo(vodClient,videoId);
Thread.sleep(1000);
}
// Jika Anda menetapkan gambar mini untuk video yang sudah ada, Anda dapat mulai mengirimkan pekerjaan snapshot dari langkah ini.
submitSnapshotJob(vodClient,videoId);
// Polling hasil snapshot.
String coverUrl = "";
while(StringUtils.isBlank(coverUrl)){
coverUrl = listSnapshots(vodClient,videoId);
Thread.sleep(1000);
}
// Modifikasi gambar mini video.
updateVideoInfo(vodClient,videoId,coverUrl);
}catch (Exception e){
}
}
/**
* Mengirimkan pekerjaan snapshot.
*/
public static SubmitSnapshotJobResponse submitSnapshotJob(DefaultAcsClient vodClient, String vid) throws ClientException {
SubmitSnapshotJobRequest request = new SubmitSnapshotJobRequest();
request.setVideoId(vid);
request.setSnapshotTemplateId("1f27a7f*********70eba2756");
// Parameter pass-through kustom. Tersedia dalam callback dan bersifat opsional. Digunakan untuk membedakan snapshot frame pertama untuk gambar mini.
request.setUserData("{\"Extend\":{\"SnapshotType\":\"FirstFrame\",\"VideoId\":\"a42bf540********33b79f0102\"}}");
return vodClient.getAcsResponse(request);
}
/**
* Memodifikasi gambar mini video.
*/
public static UpdateVideoInfoResponse updateVideoInfo(DefaultAcsClient vodClient, String vid, String coverUrl) throws ClientException {
UpdateVideoInfoRequest request = new UpdateVideoInfoRequest();
request.setVideoId(vid);
// Saat menetapkan gambar mini frame pertama, CoverURL adalah URL gambar yang dikembalikan setelah pekerjaan snapshot frame pertama berhasil.
request.setCoverURL(coverUrl);
return vodClient.getAcsResponse(request);
}
/**
* Menginisialisasi instans SDK.
*/
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
// Wilayah tempat ApsaraVideo VOD diaktifkan.
String regionId = "cn-shanghai";
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
/**
* Menanyakan snapshot.
*/
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;
}
/**
* Menanyakan video tunggal.
*/
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;
}
}
Langkah 3: (Opsional) Pra-ambil sumber daya video
Fitur pra-ambil memungkinkan ApsaraVideo VOD untuk mengambil sumber daya video dari server origin dan menyimpannya di cache pada titik keberadaan (POPs) Alibaba Cloud CDN terlebih dahulu. Dengan demikian, pengguna dapat memperoleh sumber daya terbaru dari POPs tanpa perlu mengambilnya dari server origin. Hal ini mempercepat pemutaran video dan mendukung preload video pada ApsaraVideo Player.
Anda akan dikenai biaya untuk lalu lintas origin saat menggunakan fitur segarkan dan ambil awal. Gunakan fitur pra-ambil berdasarkan popularitas video.
Konfigurasi konsol
Masuk ke Konsol ApsaraVideo VOD.
Di panel navigasi sebelah kiri, pilih Configuration Management > CDN Configuration > Refresh and Prefetch.
Di tab Purge Cache, konfigurasikan informasi pra-ambil.
Untuk Jenis Operasi, pilih Prefetch.
Jenis Purge: Parameter ini tetap URL.
URL: Masukkan URL sumber daya video yang ingin Anda pra-ambil. Setiap URL harus diawali dengan
http://atauhttps://. Anda dapat melakukan pra-ambil sumber daya dari maksimal 500 URL per hari. Anda dapat menentukan hingga 100 URL dalam satu permintaan.
Klik Submit untuk menyelesaikan konfigurasi pra-ambil.
Konfigurasi dengan OpenAPI
Panggil operasi PreloadVodObjectCaches untuk melakukan pra-ambil sumber daya video.
Langkah 4: Gunakan ApsaraVideo Player untuk memutar video
Gunakan ApsaraVideo Player untuk memutar video berdasarkan UrlSource.