Tutorial ini menjelaskan cara membuat dan mengedit sorotan wajah secara efisien dengan memanfaatkan fitur pencarian wajah dan pengeditan video dari Intelligent Media Services (IMS). Untuk membantu Anda memulai dan menghasilkan sorotan wajah berkualitas tinggi, tutorial ini mencakup operasi dasar pengambilan aset media cerdas, prosedur pemanggilan API untuk pencarian wajah, konfigurasi timeline, serta penggunaan templat lanjutan.
Informasi latar belakang
Seiring pesatnya pertumbuhan konten video, kemampuan mengidentifikasi dan menghasilkan klip video karakter utama secara cepat telah menjadi kebutuhan penting. Sebagai metode penyajian video yang efektif, sorotan wajah menampilkan aktivitas tertentu dalam berbagai adegan dan banyak digunakan di berbagai bidang, seperti produksi film dan televisi, laporan berita, serta hiburan sosial. Tutorial berikut menunjukkan cara menghasilkan video sorotan wajah secara efisien menggunakan IMS.
Skenario contoh
Skenario 1: Sorotan atlet dalam acara olahraga, seperti maraton
Dalam acara olahraga seperti maraton, penyelenggara atau agensi berita perlu menghasilkan video sorotan atlet selama pertandingan, misalnya momen berlari kencang dan menyalip lawan. Video sorotan ini sangat penting untuk promosi, tinjauan ulang, dan publisitas pribadi para atlet.
Skenario 2: Sorotan pengunjung di taman hiburan
Untuk meningkatkan pengalaman pengunjung, taman hiburan cenderung membuat klip video personalisasi bagi pengunjung guna merekam momen-momen menarik mereka di berbagai wahana, seperti berteriak di roller coaster dan tertawa di komidi putar. Video sorotan ini dapat dijadikan kenang-kenangan oleh pengunjung atau bahan promosi di media sosial oleh taman hiburan.
Skenario 3: Di balik layar upacara, seperti upacara pernikahan
Di industri layanan pernikahan, video pernikahan merekam kenangan penting bagi pengantin baru. Baik cuplikan di balik layar hari pernikahan maupun video perjalanan pasangan harus diedit dan dirangkai ulang secara hati-hati untuk menampilkan kisah cinta pengantin baru dan momen romantis pernikahan.
Skenario 4: Koleksi wajah penggemar di konser
Pada konser berskala besar, penyelenggara cenderung menghasilkan koleksi wajah penggemar untuk menunjukkan antusiasme dan keterlibatan penonton. Sorotan wajah ini dapat ditampilkan di layar lebar guna memeriahkan suasana konser dan juga dapat digunakan sebagai materi promosi di media sosial.
Selain itu, sorotan wajah dapat digunakan secara luas di berbagai bidang lain, termasuk memoar pribadi, video peringatan keluarga, video promosi pariwisata, rapat tahunan perusahaan, serta tinjauan dan interaksi acara.
Prosedur
Prasyarat
SDK sisi server IMS telah diinstal. Untuk informasi lebih lanjut, lihat Persiapan. Jika SDK sudah terinstal, lewati langkah ini.
Langkah 1: Kueri informasi klip video dengan menggunakan pencarian wajah
Anda dapat menggunakan fitur pencarian wajah dari Intelligent Media Services untuk mengambil materi video dan mendapatkan informasi segmen media yang berisi wajah. Untuk informasi lebih lanjut mengenai langkah ini, lihat Cari wajah dalam banyak aset media.
Langkah 2: Edit klip video yang berisi wajah tertentu
Langkah ini menjelaskan tiga metode untuk menghasilkan video sorotan wajah, termasuk skenario penggunaan, prosedur, contoh kode SDK, dan video contoh.
Metode 1: Gunakan produksi video otomatis berbasis skrip
Fitur
Nyaman dan efisien: Proses menghasilkan video sorotan wajah menjadi lebih mudah melalui pembuatan otomatis berbasis skrip. Pengguna dapat menghasilkan beberapa video serupa secara efisien melalui konfigurasi sederhana.
Mudah dipelajari dan ambang masuk rendah: Bahkan tanpa pengalaman pengeditan video, pengguna dapat dengan mudah menghasilkan video yang mengesankan berkat fitur produksi satu klik yang andal.
Implementasi melalui SDK
Tampilkan kode
package com.example;
import java.util.*;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.ice20201109.Client;
import com.aliyun.ice20201109.models.*;
import com.aliyun.teaopenapi.models.Config;
/**
* Tambahkan dependensi Maven berikut:
* <dependency>
* <groupId>com.aliyun</groupId>
* <artifactId>ice20201109</artifactId>
* <version>2.3.0</version>
* </dependency>
* <dependency>
* <groupId>com.alibaba</groupId>
* <artifactId>fastjson</artifactId>
* <version>1.2.9</version>
* </dependency>
*/
public class SubmitFaceEditingJobService {
static final String regionId = "cn-shanghai";
static final String bucket = "<your-bucket>";
/*** Kirim tugas produksi sorotan wajah satu klik berdasarkan hasil pencarian wajah ****/
public static void submitBatchEditingJob(String mediaId, SearchMediaClipByFaceResponse response) throws Exception {
Client iceClient = initClient();
JSONArray intervals = buildIntervals(response);
JSONObject editingTimeline = buildEditingTimeline(mediaId, intervals);
String openingMediaId = "icepublic-9a2df29956582a68a59e244a5915228c";
String endingMediaId = "icepublic-1790626066bee650ac93bd12622a921c";
String mainGroupName = "main";
String openingGroupName = "opening";
String endingGroupName = "ending";
JSONObject inputConfig = buildInputConfig(mediaId, mainGroupName, openingMediaId, openingGroupName, endingMediaId, endingGroupName);
JSONObject editingConfig = buildEditingConfig(mediaId, mainGroupName, intervals, openingMediaId, openingGroupName, endingMediaId, endingGroupName);
JSONObject outputConfig = new JSONObject();
outputConfig.put("MediaURL", "https://ice-auto-test.oss-cn-shanghai.aliyuncs.com/testBatch/" + System.currentTimeMillis() + "{index}.mp4");
outputConfig.put("Width", 1280);
outputConfig.put("Height", 720);
outputConfig.put("FixedDuration", 18);
outputConfig.put("Count", 2);
SubmitBatchMediaProducingJobRequest request = new SubmitBatchMediaProducingJobRequest();
request.setInputConfig(inputConfig.toJSONString());
request.setEditingConfig(editingConfig.toJSONString());
request.setOutputConfig(outputConfig.toJSONString());
SubmitBatchMediaProducingJobResponse response = iceClient.submitBatchMediaProducingJob(request);
System.out.println("JobId: " + response.getBody().getJobId());
}
public Client initClient() throws Exception {
// Pasangan AccessKey akun Alibaba Cloud memiliki izin akses ke semua operasi API. Kami menyarankan agar Anda menggunakan pasangan AccessKey pengguna Resource Access Management (RAM) untuk memanggil operasi API atau melakukan O&M rutin.
// Dalam contoh ini, ID AccessKey dan Rahasia AccessKey diperoleh dari variabel lingkungan. Untuk informasi tentang cara mengonfigurasi variabel lingkungan untuk menyimpan ID AccessKey dan Rahasia AccessKey, kunjungi https://www.alibabacloud.com/help/zh/sdk/developer-reference/v2-manage-access-credentials
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
Config config = new Config();
config.setCredential(credentialClient);
// Untuk menyematkan ID AccessKey dan Rahasia AccessKey secara langsung, gunakan baris berikut. Namun, demi alasan keamanan, kami tidak menyarankan Anda menyematkan ID AccessKey dan Rahasia AccessKey secara langsung.
// config.accessKeyId = <AccessKey ID created in step 2>;
// config.accessKeySecret = <AccessKey Secret created in step 2>;
config.endpoint = "ice." + regionId + ".aliyuncs.com";
config.regionId = regionId;
return new Client(config);
}
public JSONArray buildIntervals(SearchMediaClipByFaceResponse response) {
JSONArray intervals = new JSONArray();
List<SearchMediaClipByFaceResponseBodyMediaClipListOccurrencesInfos> occurrencesInfos =
response.getBody().getMediaClipList().get(0).getOccurrencesInfos();
for (SearchMediaClipByFaceResponseBodyMediaClipListOccurrencesInfos occurrence: occurrencesInfos) {
Float startTime = occurrence.getStartTime();
Float endTime = occurrence.getEndTime();
// Anda dapat menyesuaikan logika penyaringan
// Saring klip yang durasinya kurang dari 2 detik
if (endTime - startTime < 2) {
continue;
}
// Potong klip yang lebih panjang dari 6 detik
if (endTime - startTime > 6) {
endTime = startTime + 6;
}
JSONObject interval = new JSONObject();
interval.put("In", startTime);
interval.put("Out", endTime);
intervals.add(interval);
}
return intervals;
}
public static JSONObject buildSingleInterval(Float in, Float out) {
JSONObject interval = new JSONObject();
interval.put("In", in);
interval.put("Out", out);
return interval;
}
public static JSONObject buildMediaMetaData(String mediaId, String groupName, JSONArray intervals) {
JSONObject mediaMetaData = new JSONObject();
mediaMetaData.put("Media", mediaId);
mediaMetaData.put("GroupName", groupName);
mediaMetaData.put("TimeRangeList", intervals);
return mediaMetaData;
}
public static JSONObject buildInputConfig(String mediaId, String mainGroupName, String openingMediaId, String openingGroupName, String endingMediaId, String endingGroupName) {
JSONObject inputConfig = new JSONObject();
JSONArray mediaGroupArray = new JSONArray();
if (openingMediaId != null) {
// Konfigurasikan kredit pembuka sesuai kebutuhan
JSONObject openingGroup = new JSONObject();
openingGroup.put("GroupName", openingGroupName);
openingGroup.put("MediaArray", Arrays.asList(openingMediaId));
mediaGroupArray.add(openingGroup);
}
JSONObject mediaGroupMain = new JSONObject();
mediaGroupMain.put("GroupName", mainGroupName);
mediaGroupMain.put("MediaArray", Arrays.asList(mediaId));
mediaGroupArray.add(mediaGroupMain);
if (endingMediaId != null) {
// Konfigurasikan kredit penutup sesuai kebutuhan
JSONObject endingGroup = new JSONObject();
endingGroup.put("GroupName", endingGroupName);
endingGroup.put("MediaArray", Arrays.asList(endingMediaId));
mediaGroupArray.add(endingGroup);
}
inputConfig.put("MediaGroupArray", mediaGroupArray);
// Musik latar kustom
inputConfig.put("BackgroundMusicArray", Arrays.asList("icepublic-0c4475c3936f3a8743850f2da942ceee"));
return inputConfig;
}
public static JSONObject buildEditingConfig(String mediaId, String mainGroupName, JSONArray intervals, String openingMediaId, String openingGroupName, String endingMediaId, String endingGroupName) {
JSONObject editingConfig = new JSONObject();
JSONObject mediaConfig = new JSONObject();
JSONArray mediaMetaDataArray = new JSONArray();
if (openingMediaId != null) {
// Konfigurasikan titik masuk dan keluar untuk materi pembuka sesuai kebutuhan
JSONObject openingInterval = buildSingleInterval(1.5f, 5.5f);
JSONArray openingIntervals = new JSONArray();
openingIntervals.add(openingInterval);
JSONObject metaData = buildMediaMetaData(openingMediaId, openingGroupName, openingIntervals);
mediaMetaDataArray.add(metaData);
}
// Konfigurasikan titik masuk dan keluar untuk materi utama (segmen kemunculan wajah)
JSONObject mainMediaMetaData = buildMediaMetaData(mediaId, mainGroupName, intervals);
mediaMetaDataArray.add(mainMediaMetaData);
if (endingMediaId != null) {
// Konfigurasikan titik masuk dan keluar untuk materi penutup sesuai kebutuhan
JSONObject endingInterval = buildSingleInterval(1.5f, 5.5f);
JSONArray endingIntervals = new JSONArray();
endingIntervals.add(endingInterval);
JSONObject metaData = buildMediaMetaData(endingMediaId, endingGroupName, endingIntervals);
mediaMetaDataArray.add(metaData);
}
mediaConfig.put("MediaMetaDataArray", mediaMetaDataArray);
editingConfig.put("MediaConfig", mediaConfig);
return editingConfig;
}
}
Implementasi melalui konsol
Jika Anda memilih menggunakan konsol untuk produksi video, Anda dapat melewatkan "Langkah 1: Kueri informasi klip video dengan menggunakan pencarian wajah" dan mengikuti langkah-langkah berikut sebagai gantinya.
Langkah 1: Klik "Produksi Satu Klik Batch Cerdas" di bilah sisi kiri konsol, lalu klik "Buat Produksi Otomatis Berbasis Skrip" di bagian "Produksi Otomatis Berbasis Skrip", dan pilih "Mode Generasi" (baik mode narasi maupun mode grup dapat digunakan; contoh ini akan menggunakan mode grup). Masuk ke halaman pembuatan.

Langkah 2: Klik "Tambah Materi" di bagian "Konfigurasi Node Skrip". Pada kotak dialog "Tambah Materi" di sebelah kanan, pilih "Pencarian Wajah", lalu unggah citra wajah untuk mencari materi. Hasil pencarian akan muncul seperti di bawah ini.
Langkah 3: Pada daftar hasil pencarian, klik tombol [Lihat] untuk materi hasil pencarian guna melihat segmen yang cocok. Kemudian, klik [Impor Segmen yang Cocok] dan klik [OK] di bagian bawah daftar untuk menambahkan materi yang cocok ke node skrip.
Langkah 4: Jika Anda ingin melihat atau menyesuaikan segmen hasil pencarian wajah, arahkan kursor ke materi tersebut dan klik tombol pengaturan untuk membuka kotak dialog pengaturan. Di sini, Anda dapat menyesuaikan secara manual segmen yang cocok di bawah [Pemangkasan Konten Video]. (Jika Anda tidak perlu menyesuaikan titik masuk dan keluar, Anda dapat melewatkan langkah 4.)
Setelah menyelesaikan langkah-langkah ini, ikuti alur kerja produksi berbasis skrip biasa (termasuk judul, musik latar, stiker logo, dan pengaturan video) untuk mengonfigurasi dan mengirimkan tugas.
Metode 2: Gunakan timeline
Fitur
Konten video yang sangat dapat dikustomisasi: Pengeditan timeline sangat fleksibel. Anda dapat mengontrol setiap pemangkasan, efek khusus, transisi, dan efek audio. Anda dapat menggabungkan dan menyesuaikan materi berdasarkan inspirasi dan kebutuhan Anda sendiri untuk menghasilkan video yang unik.
Fleksibilitas tinggi: Pengeditan timeline tidak dibatasi oleh templat. Anda dapat menyesuaikan skema pengeditan kapan saja berdasarkan kebutuhan proyek. Pengeditan timeline membantu Anda memenuhi berbagai kebutuhan produksi video, seperti menyesuaikan urutan klip, menambahkan efek khusus, dan mengelola efek audio.
Prosedur
Berdasarkan hasil pencarian wajah dari Langkah 1, Anda dapat menggunakan operasi SubmitMediaProducingJob dan Konfigurasi timeline untuk mengedit video sorotan wajah. Anda dapat merujuk pada contoh kode SDK di bagian berikut. Untuk kebutuhan pengeditan lanjutan, seperti efek khusus, transisi, dan pemrosesan audio, kami menyarankan Anda membaca dan merujuk pada Parameter dasar pengeditan video dan Konfigurasi timeline untuk memperoleh pemahaman yang lebih komprehensif tentang cara menggunakan fitur pengeditan video guna menghasilkan video sorotan wajah.
Contoh kode SDK
Tampilkan parameter timeline
{
"VideoTracks": [
{
"VideoTrackClips": [
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 54.106018,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 56.126015
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 271.47302,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 277.393
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 326.03903,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 331.959
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 372.20602,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 375.126
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 383.03903,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 388.959
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 581.339,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 587.25903
},
{
"MediaId": "b5a003f0cd3f71ed919fe7e7c45b****",
"In": 602.339,
"Effects": [
{
"Type": "Volume",
"Gain": 0
}
],
"Out": 607.293
}
]
}
],
"AudioTracks": [
{
"AudioTrackClips": [
{
"LoopMode": true,
"MediaId": "icepublic-0c4475c3936f3a8743850f2da942ceee"
}
]
}
]
}
Metode 3: Gunakan templat lanjutan
Fitur
Efisien dan berkualitas tinggi: Templat lanjutan menyediakan templat siap pakai. Anda hanya perlu menambahkan materi Anda sendiri ke dalam templat untuk menyelesaikan produksi video, yang sangat menghemat waktu produksi. Anda juga dapat merancang templat Anda sendiri untuk meningkatkan kualitas video.
Gaya video konsisten: Templat memastikan konsistensi dan profesionalisme gaya video. Anda dapat menghasilkan video profesional dengan tingkat klik tinggi meskipun tidak memiliki keterampilan profesional dalam produksi video.
Prosedur
Berdasarkan hasil pencarian wajah dari Langkah 1, Anda dapat menggunakan "Templat Lanjutan + ClipsParam" dalam SubmitMediaProducingJob - Kirim tugas pengeditan dan produksi media untuk menyelesaikan pengeditan video sorotan wajah. Anda dapat merujuk pada contoh kode SDK di bawah ini, yang menggunakan templat publik IceSys_VETemplate_s100241 sebagai contoh untuk mengonfigurasi segmen video berdasarkan hasil pencarian wajah. Jika Anda perlu menggunakan templat lanjutan kustom Anda sendiri untuk pembuatan video sorotan wajah, kami menyarankan Anda membaca dan merujuk pada Panduan pengguna - Cara menggunakan templat lanjutan.
Contoh kode SDK
Tampilkan kode
package com.example;
import java.util.*;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.ice20201109.Client;
import com.aliyun.ice20201109.models.*;
import com.aliyun.teaopenapi.models.Config;
/**
* Tambahkan dependensi Maven berikut:
* <dependency>
* <groupId>com.aliyun</groupId>
* <artifactId>ice20201109</artifactId>
* <version>2.3.0</version>
* </dependency>
* <dependency>
* <groupId>com.alibaba</groupId>
* <artifactId>fastjson</artifactId>
* <version>1.2.9</version>
* </dependency>
*/
public class SubmitFaceEditingJobService {
static final String regionId = "cn-shanghai";
static final String bucket = "<your-bucket>";
/*** Kirim tugas pengeditan sorotan wajah berdasarkan hasil pencarian wajah ****/
public static void submitEditingJob(String mediaId, SearchMediaClipByFaceResponse response) throws Exception {
Client iceClient = initClient();
JSONArray intervals = buildIntervals(response);
// Kirim tugas templat lanjutan. Dalam contoh ini, templat IceSys_VETemplate_s100241 digunakan untuk mengedit klip video yang diperoleh melalui pencarian wajah.
JSONObject clipParams = buildClipParams(mediaId, intervals);
SubmitMediaProducingJobRequest request2 = new SubmitMediaProducingJobRequest();
request2.setTemplateId("IceSys_VETemplate_s100241");
request2.setClipsParam(clipParams.toJSONString());
request2.setOutputMediaTarget("oss-object");
outputConfig = new JSONObject();
outputConfig.put("MediaURL",
"https://" + bucket + ".oss-" + regionId + "/testTemplate/" + System.currentTimeMillis() + ".mp4");
request2.setOutputMediaConfig(outputConfig.toJSONString());
SubmitMediaProducingJobResponse response2 = iceClient.submitMediaProducingJob(request2);
System.out.println("JobId: " + response2.getBody().getJobId());
}
public Client initClient() throws Exception {
// Pasangan AccessKey akun Alibaba Cloud memiliki izin akses ke semua operasi API. Kami menyarankan agar Anda menggunakan pasangan AccessKey pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin.
// Dalam contoh ini, ID AccessKey dan Rahasia AccessKey diperoleh dari variabel lingkungan. Untuk informasi tentang cara mengonfigurasi variabel lingkungan, lihat: https://www.alibabacloud.com/help/zh/sdk/developer-reference/v2-manage-access-credentials
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
Config config = new Config();
config.setCredential(credentialClient);
// Untuk menyematkan ID AccessKey dan Rahasia AccessKey secara langsung, gunakan kode berikut. Namun, kami tidak menyarankan Anda menyimpan ID AccessKey dan Rahasia AccessKey dalam kode proyek Anda. Jika tidak, pasangan AccessKey dapat bocor dan keamanan sumber daya dalam akun Anda dapat terganggu.
// config.accessKeyId = <AccessKey ID created in step 2>;
// config.accessKeySecret = <AccessKey Secret created in step 2>;
config.endpoint = "ice." + regionId + ".aliyuncs.com";
config.regionId = regionId;
return new Client(config);
}
public JSONArray buildIntervals(SearchMediaClipByFaceResponse response) {
JSONArray intervals = new JSONArray();
List<SearchMediaClipByFaceResponseBodyMediaClipListOccurrencesInfos> occurrencesInfos =
response.getBody().getMediaClipList().get(0).getOccurrencesInfos();
for (SearchMediaClipByFaceResponseBodyMediaClipListOccurrencesInfos occurrence: occurrencesInfos) {
Float startTime = occurrence.getStartTime();
Float endTime = occurrence.getEndTime();
// Anda dapat menyesuaikan logika penyaringan
// Saring klip yang durasinya kurang dari 2 detik
if (endTime - startTime < 2) {
continue;
}
// Potong klip yang lebih panjang dari 6 detik
if (endTime - startTime > 6) {
endTime = startTime + 6;
}
JSONObject interval = new JSONObject();
interval.put("In", startTime);
interval.put("Out", endTime);
intervals.add(interval);
}
return intervals;
}
public JSONObject buildClipParams(String mediaId, JSONArray intervals) {
JSONObject clipParams = new JSONObject();
for (int i = 0; i< intervals.size(); i++) {
JSONObject interval = intervals.getJSONObject(i);
Float in = interval.getFloat("In");
Float out = interval.getFloat("Out");
clipParams.put("Media" + i, mediaId);
clipParams.put("Media" + i + ".clip_start", in);
}
return clipParams;
}
}
Tampilkan parameter clipParams
{
"Media0": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media0.clip_start": 54.066017,
"Media1": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media1.clip_start": 67.33301,
"Media2": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media2.clip_start": 271.47302,
"Media3": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media3.clip_start": 326.03903,
"Media4": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media4.clip_start": 372.20602,
"Media5": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media5.clip_start": 383.03903,
"Media6": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media6.clip_start": 581.339,
"Media7": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media7.clip_start": 587.25903,
"Media8": "b5a003f0cd3f71ed919fe7e7c45b****",
"Media8.clip_start": 602.339
}
Video contoh
Video yang dibuat menggunakan pengeditan Timeline Ini adalah video sorotan wajah pemain dengan jersey putih bernomor 5. | Video yang dibuat menggunakan templat lanjutan Transisi dan efek kecepatan dalam video akhir semuanya merupakan efek templat. |
|
Video yang dibuat menggunakan produksi otomatis berbasis skrip - metode SDK Ini adalah video sorotan wajah pemain dengan jersey putih bernomor 5. | Video yang dibuat menggunakan produksi otomatis berbasis skrip - metode konsol Ini adalah video sorotan wajah pemain dengan jersey putih bernomor 17. |
|