Kombinasikan pra-pemuatan SDK Pemutar Video Apsara dan gambar mini video untuk mencapai startup tingkat milidetik, menghilangkan loading lambat dan tersendat pada skenario video pendek.
Ikhtisar solusi
Pemutaran video mungkin menampilkan layar hitam selama pemuatan awal. Untuk mengatasinya, aktifkan pra-pemuatan di Pemutar Video Apsara agar data video diambil terlebih dahulu, dan atur frame pertama sebagai gambar mini sehingga langsung ditampilkan saat video sedang buffering. Pendekatan ini memberikan pemutaran mulus tanpa penundaan yang terlihat.
Dengan solusi ini, waktu startup rata-rata dapat diperpendek menjadi sekitar 300 milidetik di lingkungan Wi-Fi.
Batasan
Hanya SDK Pemutar Video Apsara untuk Android dan iOS yang mendukung pemutaran layar penuh dengan pemuatan instan.
Anda hanya dapat melakukan pra-pemuatan satu file MP4, MP3, FLV, atau HLS dalam satu waktu.
Mainkan video yang telah dipra-muat hanya dengan UrlSource. VidAuth dan VidSts tidak didukung untuk pemutaran video yang telah dipra-muat.
Prasyarat
ApsaraVideo VOD telah diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan ApsaraVideo VOD.
SDK Pemutar Video Apsara telah diintegrasikan. Integrasi cepat SDK Pemutar Video Apsara untuk Android | Integrasi cepat SDK Pemutar Video Apsara untuk iOS
Nama domain CDN telah dikonfigurasi untuk fitur Pra-ambil di ApsaraVideo VOD. Tambahkan nama domain untuk CDN
Langkah 1: Aktifkan fitur preload di SDK Pemutar Video Apsara
Pra-pemuatan mengambil data video ke perangkat lokal sebelum pemutaran dimulai, 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 fitur 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 penyimpanan cache harus berupa jalur mutlak. Contoh: /tmp. Parameter maxBufferMemoryKB pada contoh kode berikut sudah tidak digunakan lagi di SDK Pemutar Video Apsara versi V5.4.7.1 ke atas dan tidak berpengaruh. AliPlayerGlobalSettings.enableLocalCache(true,10240,"/tmp"); } }Buat instans preload. 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 pra-pemuatan. 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(); // Atur 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 pra-pemuatan 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 pra-pemuatan video menggunakan URL, bukan ID video. // Kode berikut memberikan contoh cara menggunakan medialoader untuk melakukan pra-pemuatan video setelah Anda mendapatkan URL-nya. String url="";// Anggap Anda telah mendapatkan URL video. medialoader.load(url,10000);// Lakukan pra-pemuatan 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 SDK Pemutar Video Apsara 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 ke atas dan 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]; // Atur metode callback URL untuk mencegah kegagalan pra-pemuatan yang terjadi ketika URL pra-pemuatan dan URL pemutaran tidak konsisten akibat perubahan parameter. [AliPlayerGlobalSettings setCacheUrlHashCallback:hashCallback]; // Atur 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 pra-pemuatan. #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 Anda mengonfigurasi sumber data untuk melakukan pra-pemuatan 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 dipra-muat ke jalur disk yang ditentukan. Waktu pemuatan diatur menjadi 10.000 milidetik.
Langkah 2: Atur frame pertama video sebagai gambar mini
Atur frame pertama sebagai gambar mini video untuk menghilangkan layar hitam selama startup.
Saat memutar video dalam daftar, terapkan logika berikut untuk mempercepat pemutaran dan mengurangi trafik:
Minta hanya gambar mini saat pengguna menggeser antar video dengan cepat.
Tampilkan gambar mini yang telah dipra-ambil saat setengah dari tampilan video berikutnya muncul.
Konsol
Buat templat snapshot untuk mengambil frame pertama.
Login ke Konsol ApsaraVideo for VOD.
Di panel navigasi kiri, pilih Configuration Management > Media Processing > Snapshot Templates.
Klik Create Snapshot Template. Konfigurasikan parameter untuk mengambil frame pertama.
Atur Template Name sesuai keinginan. Pilih Normal Snapshot untuk Snapshot Type. Atur Start Time ke 00:00:00 dan Snapshot Count: ke 1. Konfigurasikan parameter lain sesuai kebutuhan (Snapshot templates).
Klik Save untuk membuat templat snapshot.
Kirim pekerjaan snapshot untuk mengambil frame pertama.
CatatanUntuk mengirim pekerjaan snapshot dari konsol, buat alur kerja dengan node Snapshots dan pilih templat snapshot frame pertama (Manage workflows).
Konfigurasikan notifikasi event SnapshotComplete untuk menerima status tugas dan URL gambar yang diambil saat pekerjaan selesai (Callback settings).
Skenario 1: Ambil snapshot saat mengunggah video
Di Konsol ApsaraVideo for VOD, pilih Media Files > Audio/Video.
Klik Upload Audio/Video, lalu klik Add Audio/Video.
Atur metode unggah dan lokasi penyimpanan, tambahkan file video, lalu pilih Use Workflow. Pilih alur kerja yang telah Anda buat untuk mengambil frame pertama.
Klik Upload.
Skenario 2: Ambil snapshot setelah video diunggah
Di Konsol ApsaraVideo for VOD, pilih Media Files > Audio/Video.
Di daftar audio/video, temukan video target dan klik Media Processing di kolom Actions.
Atur Processing Type ke Use Workflow, dan atur parameter Workflows ke alur kerja yang telah Anda buat untuk mengambil frame pertama.
Klik OK.
Dapatkan hasil snapshot
Jika Anda telah mengonfigurasi notifikasi event SnapshotComplete, Anda dapat memperoleh status tugas dan URL gambar yang diambil dari callback.
Jika Anda belum mengonfigurasi notifikasi event, Anda dapat secara berkala memanggil operasi ListSnapshots untuk mem-poll status tugas dan URL gambar yang diambil.
Atur gambar mini video ke snapshot frame pertama.
CatatanSimpan snapshot dari Langkah 2 ke komputer lokal Anda sebelum mengunggahnya sebagai gambar mini.
Di Konsol ApsaraVideo for VOD, pilih Media Files > Audio/Video.
Di daftar audio/video, temukan video target dan klik Manage di kolom Actions.
Di tab Basic information, klik Editing Video Information .
Klik Upload, pilih snapshot frame pertama yang telah Anda simpan secara lokal, lalu klik Open.
Klik Save untuk mengatur gambar mini video.
Periksa daftar audio/video untuk memverifikasi pembaruan gambar mini.
OpenAPI
Contoh berikut menggunakan Alibaba Cloud SDK untuk Java guna memanggil operasi API ApsaraVideo for VOD.
Prosedur
Buat templat snapshot untuk mengambil frame pertama.
Panggil operasi AddVodTemplate untuk membuat templat snapshot guna mengambil frame pertama. Kode berikut memberikan contohnya:
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; /** * Catatan: * 1. Demo ini menunjukkan cara membuat templat untuk mengambil frame pertama sebagai snapshot tunggal. * 2. Kami menyarankan menggunakan Konsol ApsaraVideo for VOD untuk membuat templat snapshot guna pengalaman yang lebih nyaman. */ public class AddSnapshotTemplate { // Pasangan Kunci Akses Akun Alibaba Cloud memiliki izin atas semua operasi API. Kami menyarankan Anda menggunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin. // Jangan hard-code ID AccessKey dan AccessKey Secret dalam proyek Anda. Jika tidak, pasangan AccessKey tersebut dapat bocor dan keamanan semua sumber daya Anda dapat terganggu. // Contoh ini menunjukkan cara menggunakan Variabel lingkungan untuk memperoleh pasangan AccessKey guna verifikasi identitas. Sebelum menjalankan kode, 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("Templat snapshot frame pertama"); 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 for VOD diaktifkan. String regionId = "cn-shanghai"; DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(profile); return client; } }Kirim pekerjaan snapshot untuk mengambil frame pertama.
Panggil operasi SubmitSnapshotJob untuk mengirim pekerjaan snapshot. Kode berikut memberikan contohnya:
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.vod.model.v20170321.*; /** * Catatan: * 1. Demo ini menunjukkan cara mengirim pekerjaan snapshot setelah templat snapshot frame pertama dibuat. * 2. Untuk video yang baru diunggah, kami menyarankan melakukan langkah ini setelah event `VideoAnalysisComplete` berhasil. Untuk video yang sudah ada dengan status Normal, Anda dapat merancang proses sendiri. * 3. Snapshot merupakan tugas asinkron. Kami menyarankan menunggu hingga event `SnapshotComplete` berhasil sebelum mengambil URL snapshot. * 4. Anda dapat menginferensi URL output snapshot dari `SnapshotRegular` dalam callback event. Untuk informasi lebih lanjut tentang aturan pembuatan URL, lihat topik `SnapshotComplete`. * 5. Jika Anda tidak memiliki layanan callback, Anda juga dapat memanggil operasi `ListSnapshots` untuk mem-poll hasilnya. Operasi ini secara default hanya mengembalikan hasil snapshot terbaru. Untuk informasi lebih lanjut, lihat referensi API `ListSnapshots`. */ public class SubmitSnapshotJob { // Pasangan Kunci Akses Akun Alibaba Cloud memiliki izin atas semua operasi API. Kami menyarankan Anda menggunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin. // Jangan hard-code ID AccessKey dan AccessKey Secret dalam proyek Anda. Jika tidak, pasangan AccessKey tersebut dapat bocor dan keamanan semua sumber daya Anda dapat terganggu. // Contoh ini menunjukkan cara menggunakan Variabel lingkungan untuk memperoleh pasangan AccessKey guna verifikasi identitas. Sebelum menjalankan kode, 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"); // Opsional. Parameter pass-through kustom yang tersedia dalam callback. Gunakan ini untuk mengidentifikasi snapshot frame pertama. 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 for VOD diaktifkan. String regionId = "cn-shanghai"; DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(profile); return client; } // Panggil ListSnapshots untuk mengkueri 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); } }Atur gambar mini video ke snapshot frame pertama.
Contoh ini memodifikasi gambar mini video tunggal setelah diunggah. Metode lain: Atur gambar mini saat mengunggah video dan Perbarui gambar mini setelah video diunggah.
Panggil operasi UpdateVideoInfo dan berikan parameter
CoverURLuntuk menentukan gambar mini video. Kode berikut memberikan contohnya: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; /** * Catatan: * 1. Demo ini menunjukkan cara memperbarui gambar mini video tunggal. Untuk memodifikasi parameter video lainnya, lihat referensi API `UpdateVideoInfo`. * 2. Saat memperbarui gambar mini, pastikan URL gambar yang Anda berikan valid. */ public class UpdateVideoInfo { // Pasangan Kunci Akses Akun Alibaba Cloud memiliki izin atas semua operasi API. Kami menyarankan Anda menggunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin. // Jangan hard-code ID AccessKey dan AccessKey Secret dalam proyek Anda. Jika tidak, pasangan AccessKey tersebut dapat bocor dan keamanan semua sumber daya Anda dapat terganggu. // Contoh ini menunjukkan cara menggunakan Variabel lingkungan untuk memperoleh pasangan AccessKey guna verifikasi identitas. Sebelum menjalankan kode, 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 mengatur gambar mini frame pertama, atur `CoverURL` ke URL gambar yang dihasilkan 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 for 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.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;
/**
* Catatan:
* 1. Demo ini menyediakan logika lengkap untuk mengambil snapshot dan memperbarui gambar mini. Anda harus menyesuaikan bagian kode tertentu dengan logika bisnis Anda.
* 2. Demo ini tidak dapat dijalankan langsung. Anda harus menambahkan logika yang diperlukan.
* 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. Kami menyarankan Anda menggunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin.
// Jangan hard-code ID AccessKey dan AccessKey Secret dalam proyek Anda. Jika tidak, pasangan AccessKey tersebut dapat bocor dan keamanan semua sumber daya Anda dapat terganggu.
// Contoh ini menunjukkan cara menggunakan Variabel lingkungan untuk memperoleh pasangan AccessKey guna verifikasi identitas. Sebelum menjalankan kode, 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 menggunakan Message Service (MNS).
// Jika Anda mengatur gambar mini untuk video yang baru diunggah, Anda harus terlebih dahulu menerima event keberhasilan analisis video.
// Jika Anda mengatur gambar mini untuk video yang sudah ada, Anda dapat langsung mengirim pekerjaan snapshot dari langkah ini.
submitSnapshotJob(vodClient,videoId);
// Setelah Anda menerima callback event `SnapshotComplete`, 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)){
// Ganti logika jalur snapshot di sini dengan logika kustom Anda.
String coverUrl = callBackMessage.getJSONArray("SnapshotInfos").getJSONObject(0).getString("SnapshotRegular").replace("{SnapshotCount}","00001");
// Perbarui gambar mini video.
updateVideoInfo(vodClient,videoId,coverUrl);
}
// Skenario 2: Anda tidak memiliki layanan callback atau menggunakan MNS.
// Jika Anda mengatur gambar mini untuk video yang baru diunggah, poll status video setelah unggah.
String videoStatus = "";
while(!"Normal".equals(videoStatus)){
videoStatus = getVideoInfo(vodClient,videoId);
Thread.sleep(1000);
}
// Jika Anda mengatur gambar mini untuk video yang sudah ada, Anda dapat langsung mengirim pekerjaan snapshot dari langkah ini.
submitSnapshotJob(vodClient,videoId);
// Poll hasil snapshot.
String coverUrl = "";
while(StringUtils.isBlank(coverUrl)){
coverUrl = listSnapshots(vodClient,videoId);
Thread.sleep(1000);
}
// Perbarui gambar mini video.
updateVideoInfo(vodClient,videoId,coverUrl);
}catch (Exception e){
}
}
/**
* Kirim pekerjaan snapshot.
*/
public static SubmitSnapshotJobResponse submitSnapshotJob(DefaultAcsClient vodClient, String vid) throws ClientException {
SubmitSnapshotJobRequest request = new SubmitSnapshotJobRequest();
request.setVideoId(vid);
request.setSnapshotTemplateId("1f27a7f*********70eba2756");
// Opsional. Parameter pass-through kustom yang tersedia dalam callback. Gunakan ini untuk mengidentifikasi snapshot frame pertama.
request.setUserData("{\"Extend\":{\"SnapshotType\":\"FirstFrame\",\"VideoId\":\"a42bf540********33b79f0102\"}}");
return vodClient.getAcsResponse(request);
}
/**
* Perbarui gambar mini video.
*/
public static UpdateVideoInfoResponse updateVideoInfo(DefaultAcsClient vodClient, String vid, String coverUrl) throws ClientException {
UpdateVideoInfoRequest request = new UpdateVideoInfoRequest();
request.setVideoId(vid);
// Saat mengatur gambar mini frame pertama, atur `CoverURL` ke URL gambar yang dihasilkan setelah pekerjaan snapshot frame pertama berhasil.
request.setCoverURL(coverUrl);
return vodClient.getAcsResponse(request);
}
/**
* Inisialisasi instans SDK.
*/
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
// Wilayah tempat ApsaraVideo for VOD diaktifkan.
String regionId = "cn-shanghai";
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
/**
* Kueri 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;
}
/**
* Kueri 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
Pra-ambil menyimpan cache sumber daya video dari server origin ke titik keberadaan (POPs) CDN terlebih dahulu. Pengguna mengambil sumber daya langsung dari POPs, mempercepat pemutaran, dan melengkapi pra-pemuatan di sisi klien.
Fitur pra-ambil dikenai biaya lalu lintas origin. Lakukan pra-ambil secara selektif berdasarkan popularitas video.
Konfigurasi konsol
Login ke Konsol ApsaraVideo VOD.
Di panel navigasi kiri, pilih Configuration Management > CDN Configuration > Refresh and Prefetch.
Di tab Purge Cache, konfigurasikan informasi pra-ambil.
Untuk Operation type, pilih Prefetch.
Purge Type: 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 Pemutar Video Apsara untuk memutar video
Mainkan video menggunakan Pemutar Video Apsara dengan UrlSource.