ApsaraVideo for VOD menggunakan snapshot yang diambil secara otomatis sebagai gambar mini video default. Anda dapat menentukan gambar mini kustom selama atau setelah proses upload.
Ikhtisar
Setiap video yang diupload ke ApsaraVideo for VOD memiliki gambar mini.
Jika Anda menentukan gambar mini saat upload, gambar tersebut akan digunakan. Jika tidak, ApsaraVideo for VOD mengambil satu hingga delapan snapshot dan memilih salah satu dari bagian tengah sebagai default (Video snapshots). Anda dapat memperbarui gambar mini setelah upload.
ApsaraVideo for VOD mendukung gambar mini reguler dan gambar mini pintar.
Gambar mini reguler: Gambar kustom yang Anda tentukan. Sumbernya mencakup gambar lokal, snapshot video, atau URL yang dapat diakses. Mendukung format statis dan animasi.
Gambar mini pintar: Sistem menganalisis konten video dan estetika visual untuk memilih keyframe atau segmen optimal. Mendukung gambar statis dan animasi yang diekstraksi dari video sumber.
Atur gambar mini saat upload
Anda hanya dapat menentukan gambar mini saat upload jika menggunakan API atau SDK (Metode upload).
Penting Parameter CoverURL menerima URL apa pun. ApsaraVideo for VOD menyimpan URL ini dan mengembalikannya saat diminta. Pastikan URL tersebut dapat diakses.
Saat memanggil operasi CreateUploadVideo, teruskan parameter CoverURL untuk menentukan URL gambar mini.
Saat memanggil operasi UploadMediaByURL, teruskan parameter CoverURL dalam UploadMetadata untuk menentukan URL gambar mini.
Perbarui gambar mini setelah upload
Setelah mengupload video, gunakan metode berikut untuk memperbarui gambar mininya.
Atur gambar mini reguler
Console
Perbarui gambar mini video di konsol ApsaraVideo for VOD menggunakan gambar lokal atau snapshot video.
Login ke konsol ApsaraVideo for VOD.
Pada panel navigasi kiri, pilih Media Files > Audio/Video.
Temukan video yang ingin Anda perbarui dan klik Manage pada kolom Actions.
Pada tab Basic Information, klik Editing Video Information
.
Klik Save untuk menyelesaikan konfigurasi.
Kembali ke daftar audio/video untuk memverifikasi pembaruan gambar mini.
OpenAPI
Panggil operasi API berikut untuk memperbarui gambar mini video. URL apa pun yang dapat diakses dapat digunakan sebagai sumber gambar mini.
Penting Parameter CoverURL menerima URL apa pun. ApsaraVideo for VOD menyimpan URL ini dan mengembalikannya saat diminta. Pastikan URL tersebut dapat diakses.
Panggil operasi UpdateVideoInfo dan teruskan CoverURL untuk menentukan URL gambar mini.
Panggil operasi UpdateVideoInfos dan teruskan CoverURL dalam UpdateContent untuk menentukan URL gambar mini.
Jika video Anda berada di bucket OSS Anda sendiri yang telah didaftarkan ke ApsaraVideo for VOD, panggil operasi RegisterMedia dan teruskan CoverURL dalam RegisterMetadata untuk menentukan URL gambar mini.
Atur gambar mini pintar
Fitur gambar mini pintar menganalisis konten video, estetika visual, dan data produksi ekstensif untuk memilih keyframe atau segmen optimal, sehingga meningkatkan tingkat klik dan pengalaman pengguna.
Catatan ApsaraVideo for VOD mendukung gambar mini statis dan animasi. Gambar mini video tidak didukung.
Penggunaan
Panggil operasi AddAITemplate untuk membuat templat gambar mini pintar. Atur parameter TemplateType menjadi AIImage dan konfigurasikan parameter lain sesuai kebutuhan.
Panggil operasi SubmitAIImageJob untuk mengirim pekerjaan gambar mini pintar. Atur parameter AITemplateId ke ID templat yang telah Anda buat dan konfigurasikan parameter lain sesuai kebutuhan.
Contoh: Atur frame pertama sebagai gambar mini
Ikhtisar proses
Buat templat snapshot untuk mengambil frame pertama video.
Kirim pekerjaan snapshot untuk mengambil frame pertama.
Atur gambar mini video ke snapshot frame pertama yang diambil.
Prosedur
Console
Buat templat snapshot untuk mengambil frame pertama.
Login ke konsol ApsaraVideo for VOD.
Pada panel navigasi kiri, pilih Configuration Management > Media Processing > Snapshot Templates.
Klik Create Snapshot Template. Konfigurasikan parameter untuk mengambil frame pertama.
Tentukan Template Name kustom. 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.
Catatan Untuk mengirim pekerjaan snapshot dari konsol, buat alur kerja dengan node Snapshots dan pilih templat snapshot frame pertama (Kelola alur kerja).
Konfigurasikan notifikasi event SnapshotComplete untuk menerima status tugas dan URL gambar yang diambil saat pekerjaan selesai (Pengaturan callback).
Atur gambar mini video ke snapshot frame pertama.
Catatan Simpan snapshot dari Langkah 2 ke komputer lokal Anda sebelum menguploadnya sebagai gambar mini.
Di konsol ApsaraVideo for VOD, pilih Media Files > Audio/Video.
Pada daftar audio/video, temukan video target dan klik Manage pada kolom Actions.
Pada 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
Catatan 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 satu snapshot.
* 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 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("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 {
// 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 diupload, 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 event `SnapshotComplete` berhasil sebelum mengambil URL snapshot.
* 4. Anda dapat memperkirakan 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 memeriksa hasil secara berkala. Operasi ini hanya mengembalikan hasil snapshot terbaru secara default. 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 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 satu video setelah upload. Metode lain: Atur gambar mini saat upload video dan Perbarui gambar mini setelah upload video.
Panggil operasi UpdateVideoInfo dan teruskan parameter CoverURL untuk 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 satu video. Untuk memodifikasi parameter video lain, 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 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 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 diupload, 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 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 path 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 diupload, polling status video setelah upload.
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);
// Polling 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 instance 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 satu 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;
}
}