Anda dapat menambahkan watermark seperti logo perusahaan atau stasiun TV ke dalam video untuk meningkatkan visibilitas merek, melindungi hak cipta, dan memperkuat pengenalan produk. ApsaraVideo Media Processing (MPS) menyediakan jenis watermark berikut: image watermark, animated watermark, dan test watermark. Pilih jenis watermark sesuai dengan kebutuhan bisnis Anda. Topik ini memberikan contoh cara menggunakan API yang terenkapsulasi dalam MPS SDK untuk Java guna mengelola watermark, termasuk membuat template watermark, mengirim pekerjaan watermark teks, dan mengirim pekerjaan watermark gambar.
Prasyarat
Klien SDK harus sudah diinisialisasi. Untuk informasi lebih lanjut, lihat Inisialisasi Klien.
AddWaterMarkTemplate: Membuat template watermark
Template watermark menentukan pengaturan dari berbagai parameter, seperti ukuran dan lokasi watermark. Anda dapat menggunakan template watermark untuk menyederhanakan pengelolaan watermark. Gunakan operasi AddWaterMarkTemplate untuk membuat template watermark.
Template watermark hanya berlaku untuk watermark gambar, dan tidak berlaku untuk watermark teks.
Template watermark hanya menentukan atribut seperti lokasi dan ukuran, tetapi tidak menentukan konten watermark. Konten watermark harus ditentukan saat mengajukan pekerjaan watermark.
Jika pemanggilan berhasil, ID template watermark akan dikembalikan. Anda juga dapat membuat template watermark dan mendapatkan ID-nya melalui konsol MPS. Untuk informasi lebih lanjut, lihat Mengelola Template Watermark.
Jika muncul pesan error "Kuota sumber daya 'WatermarkTemplate' telah habis", kuota Anda untuk template watermark telah mencapai batas maksimum. Dalam hal ini, Anda dapat ajukan tiket untuk meningkatkan kuota.
/**
* Buat template watermark.
* @return
* @throws Exception
*/
public static void addWaterMarkTemplate() throws Exception {
com.aliyun.mts20140618.Client client = WaterMark.createClient();
// Untuk detail parameter watermark, kunjungi https://www.alibabacloud.com/help/zh/apsaravideo-for-media-processing/latest/parameter-details-a#section-k53-tt4-8b0.
JSONObject waterMarkConfig = new JSONObject();
waterMarkConfig.put("Dx","10");
waterMarkConfig.put("Dy","5");
waterMarkConfig.put("ReferPos","TopRight");
com.aliyun.mts20140618.models.AddWaterMarkTemplateRequest addWaterMarkTemplateRequest = new com.aliyun.mts20140618.models.AddWaterMarkTemplateRequest()
// Nama watermark.
.setName("Name")
// Konfigurasi keluaran tugas.
.setConfig(waterMarkConfig.toJSONString());
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// Tulis kode Anda sendiri untuk menampilkan respons operasi API jika diperlukan.
client.addWaterMarkTemplateWithOptions(addWaterMarkTemplateRequest, runtime);
} catch (TeaException error) {
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}SubmitJobs: Mengajukan pekerjaan watermark
Menambahkan watermark ke video mengubah gambar video, sehingga video perlu dikode ulang. MPS menyediakan operasi SubmitJobs untuk mengajukan pekerjaan watermark.
Saat memanggil operasi untuk mengajukan pekerjaan, path file yang digunakan sebagai watermark harus dilakukan URL encoding. Jika tidak, pekerjaan akan gagal. Untuk informasi lebih lanjut, lihat URL encoding.
Pastikan nama file valid agar file dapat ditemukan saat pekerjaan dijalankan. Untuk informasi lebih lanjut, lihat Detail Parameter.
Catat ID pekerjaan yang diajukan untuk mempermudah operasi selanjutnya.
Ajukan pekerjaan watermark teks
/**
* Ajukan pekerjaan watermark teks.
* @return
* @throws Exception
*/
public static void submitTextWaterMarkJobs() throws Exception {
com.aliyun.mts20140618.Client client = WaterMark.createClient();
// Konfigurasikan pengaturan keluaran watermark.
JSONArray waterMarks = new JSONArray(); // Array watermark terdiri dari maksimal empat watermark. Ini berarti aliran dapat berisi maksimal empat watermark.
// Watermark teks.
JSONObject textWaterMarks = new JSONObject();
textWaterMarks.put("WaterMarkTemplateId","<your waterMarkTemplateId>");
textWaterMarks.put("Type","Text");
// Tentukan teks yang akan digunakan sebagai watermark untuk parameter Content. Teks yang ditentukan harus dikodekan dalam Base64.
textWaterMarks.put("TextWaterMark","{\"Content\":\"5rWL6K+V5paH5a2X5rC05Y2w\",\"FontName\":\"SimSun\",\"FontSize\":\"16\",\"Top\":2,\"Left\":10}");
waterMarks.add(textWaterMarks);
com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
// Masukan pekerjaan.
.setInput("{\"Bucket\":\"exampleBucket\",\"Location\":\"oss-cn-shanghai\",\"Object\":\"example.flv\",\"Referer\": \"Parameter yang Anda atur di konsol Object Storage Service (OSS) untuk mengaktifkan fitur perlindungan hotlink\"}")
// Konfigurasi keluaran pekerjaan.
.setOutputs("[{\"OutputObject\":\"exampleOutput.mp4\",\"TemplateId\":\"6181666213ab41b9bc21da8ff5ff****\",\"WaterMarks\":" + waterMarks.toJSONString() + ",\"UserData\":\"testid-001\"}]")
// Bucket OSS tempat file keluaran disimpan.
.setOutputBucket("exampleBucket")
// Wilayah tempat bucket OSS berada.
.setOutputLocation("oss-cn-shanghai")
// ID antrian MPS.
.setPipelineId("dd3dae411e704030b921e52698e5****");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// Tulis kode Anda sendiri untuk menampilkan respons operasi API jika diperlukan.
client.submitJobsWithOptions(submitJobsRequest, runtime);
} catch (TeaException error) {
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}Watermark gambar
/**
* Ajukan pekerjaan watermark gambar.
* @return
* @throws Exception
*/
public static void submitImageWaterMarkJobs() throws Exception {
com.aliyun.mts20140618.Client client = WaterMark.createClient();
// Konfigurasikan pengaturan keluaran watermark.
JSONArray waterMarks = new JSONArray(); // Array watermark terdiri dari maksimal empat watermark. Ini berarti aliran dapat berisi maksimal empat watermark.
// Watermark gambar.
JSONObject imageWaterMarks = new JSONObject();
imageWaterMarks.put("WaterMarkTemplateId","<your waterMarkTemplateId>");
imageWaterMarks.put("Type","Image");
// Lebar dan tinggi gambar atau watermark animasi.
imageWaterMarks.put("Width","200");
imageWaterMarks.put("Height","100");
// Jalur ke gambar yang akan digunakan sebagai watermark.
JSONObject logoFile = new JSONObject();
logoFile.put("Bucket","<your bucket name>");
logoFile.put("Location","oss-cn-shanghai");
// Anda dapat menentukan gambar PNG statis, gambar PNG animasi, file MOV, atau file GIF berdasarkan kebutuhan bisnis Anda. Ekstensi nama file gambar PNG animasi harus apng. Jika gambar yang akan digunakan sebagai watermark adalah gambar non-statis, ekstensi nama file harus huruf kecil.
logoFile.put("Object", URLEncoder.encode("Dynamic logo.apng", "utf-8"));
imageWaterMarks.put("InputFile",logoFile.toJSONString());
waterMarks.add(imageWaterMarks);
com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
// Masukan pekerjaan.
.setInput("{\"Bucket\":\"exampleBucket\",\"Location\":\"oss-cn-shanghai\",\"Object\":\"example.flv\",\"Referer\": \"Parameter yang Anda atur di konsol Object Storage Service (OSS) untuk mengaktifkan fitur perlindungan hotlink\"}")
// Konfigurasi keluaran pekerjaan.
.setOutputs("[{\"OutputObject\":\"exampleOutput.mp4\",\"TemplateId\":\"6181666213ab41b9bc21da8ff5ff****\",\"WaterMarks\":" + waterMarks.toJSONString() + ",\"UserData\":\"testid-001\"}]")
// Bucket OSS tempat file keluaran disimpan.
.setOutputBucket("exampleBucket")
// Wilayah tempat bucket OSS berada.
.setOutputLocation("oss-cn-shanghai")
// ID antrian MPS.
.setPipelineId("dd3dae411e704030b921e52698e5****");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// Tulis kode Anda sendiri untuk menampilkan respons operasi API jika diperlukan.
client.submitJobsWithOptions(submitJobsRequest, runtime);
} catch (TeaException error) {
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}Kode contoh
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.tea.TeaException;
import java.net.URLEncoder;
public class WaterMark {
/**
* :
* <p>Gunakan pasangan AccessKey Anda untuk menginisialisasi klien.</p>
* @return Client
*
* @throws Exception
*/
public static com.aliyun.mts20140618.Client createClient() throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// Diperlukan. Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dikonfigurasi dalam lingkungan waktu proses kode.
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// Diperlukan. Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET dikonfigurasi.
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = "mts.cn-shanghai.aliyuncs.com";
return new com.aliyun.mts20140618.Client(config);
}
/**
* Buat template watermark.
* @return
* @throws Exception
*/
public static void addWaterMarkTemplate() throws Exception {
com.aliyun.mts20140618.Client client = WaterMark.createClient();
// Untuk informasi lebih lanjut tentang parameter watermark, kunjungi https://www.alibabacloud.com/help/zh/mps/developer-reference/parameter-details.
JSONObject waterMarkConfig = new JSONObject();
waterMarkConfig.put("Dx","10");
waterMarkConfig.put("Dy","5");
waterMarkConfig.put("ReferPos","TopRight");
com.aliyun.mts20140618.models.AddWaterMarkTemplateRequest addWaterMarkTemplateRequest = new com.aliyun.mts20140618.models.AddWaterMarkTemplateRequest()
// Nama dari watermark.
.setName("Name")
// Konfigurasi keluaran pekerjaan.
.setConfig(waterMarkConfig.toJSONString());
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// Tulis kode Anda sendiri untuk menampilkan respons dari Operasi API jika diperlukan.
client.addWaterMarkTemplateWithOptions(addWaterMarkTemplateRequest, runtime);
} catch (TeaException error) {
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
/**
* Ajukan pekerjaan watermark teks.
* @return
* @throws Exception
*/
public static void submitTextWaterMarkJobs() throws Exception {
com.aliyun.mts20140618.Client client = WaterMark.createClient();
// Konfigurasikan pengaturan keluaran watermark.
JSONArray waterMarks = new JSONArray(); // Array watermark terdiri dari maksimal empat watermark. Ini berarti bahwa aliran dapat berisi maksimal empat watermark.
// Watermark teks.
JSONObject textWaterMarks = new JSONObject();
textWaterMarks.put("WaterMarkTemplateId","<your waterMarkTemplateId>");
textWaterMarks.put("Type","Text");
// Tentukan teks yang akan digunakan sebagai watermark untuk parameter Content. Teks yang ditentukan harus dienkripsi dalam Base64.
textWaterMarks.put("TextWaterMark","{\"Content\":\"5rWL6K+V5paH5a2X5rC05Y2w\",\"FontName\":\"SimSun\",\"FontSize\":\"16\",\"Top\":2,\"Left\":10}");
waterMarks.add(textWaterMarks);
com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
// Masukan pekerjaan.
.setInput("{\"Bucket\":\"exampleBucket\",\"Location\":\"oss-cn-shanghai\",\"Object\":\"example.flv\",\"Referer\": \"Parameter yang Anda atur di konsol Object Storage Service (OSS) untuk mengaktifkan fitur perlindungan hotlink\"}")
// Konfigurasi keluaran pekerjaan.
.setOutputs("[{\"OutputObject\":\"exampleOutput.mp4\",\"TemplateId\":\"6181666213ab41b9bc21da8ff5ff****\",\"WaterMarks\":" + waterMarks.toJSONString() + ",\"UserData\":\"testid-001\"}]")
// Bucket OSS tempat file keluaran disimpan.
.setOutputBucket("exampleBucket")
// Wilayah tempat bucket OSS berada.
.setOutputLocation("oss-cn-shanghai")
// ID antrian MPS.
.setPipelineId("dd3dae411e704030b921e52698e5****");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// Tulis kode Anda sendiri untuk menampilkan respons dari Operasi API jika diperlukan.
client.submitJobsWithOptions(submitJobsRequest, runtime);
} catch (TeaException error) {
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
/**
* Ajukan pekerjaan watermark gambar.
* @return
* @throws Exception
*/
public static void submitImageWaterMarkJobs() throws Exception {
com.aliyun.mts20140618.Client client = WaterMark.createClient();
// Konfigurasikan pengaturan keluaran watermark.
JSONArray waterMarks = new JSONArray(); // Array watermark terdiri dari maksimal empat watermark. Ini berarti bahwa aliran dapat berisi maksimal empat watermark.
// Watermark gambar.
JSONObject imageWaterMarks = new JSONObject();
imageWaterMarks.put("WaterMarkTemplateId","<your waterMarkTemplateId>");
imageWaterMarks.put("Type","Image");
// Lebar dan tinggi gambar atau watermark animasi.
imageWaterMarks.put("Width","200");
imageWaterMarks.put("Height","100");
// Jalur ke gambar yang akan digunakan sebagai watermark.
JSONObject logoFile = new JSONObject();
logoFile.put("Bucket","<your bucket name>");
logoFile.put("Location","oss-cn-shanghai");
// Anda dapat menentukan gambar PNG statis, gambar PNG animasi, file MOV, atau file GIF sesuai dengan kebutuhan bisnis Anda. Ekstensi nama file gambar PNG animasi harus apng. Jika gambar yang akan digunakan sebagai watermark adalah gambar non-statis, ekstensi nama file harus dalam huruf kecil.
logoFile.put("Object", URLEncoder.encode("Dynamic logo.apng", "utf-8"));
imageWaterMarks.put("InputFile",logoFile.toJSONString());
waterMarks.add(imageWaterMarks);
com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
// Masukan pekerjaan.
.setInput("{\"Bucket\":\"exampleBucket\",\"Location\":\"oss-cn-shanghai\",\"Object\":\"example.flv\",\"Referer\": \"Parameter yang Anda atur di konsol Object Storage Service (OSS) untuk mengaktifkan fitur perlindungan hotlink\"}")
// Konfigurasi keluaran pekerjaan.
.setOutputs("[{\"OutputObject\":\"exampleOutput.mp4\",\"TemplateId\":\"6181666213ab41b9bc21da8ff5ff****\",\"WaterMarks\":" + waterMarks.toJSONString() + ",\"UserData\":\"testid-001\"}]")
// Bucket OSS tempat file keluaran disimpan.
.setOutputBucket("exampleBucket")
// Wilayah tempat bucket OSS berada.
.setOutputLocation("oss-cn-shanghai")
// ID antrian MPS.
.setPipelineId("dd3dae411e704030b921e52698e5****");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// Tulis kode Anda sendiri untuk menampilkan respons dari Operasi API jika diperlukan.
client.submitJobsWithOptions(submitJobsRequest, runtime);
} catch (TeaException error) {
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// Dalam skenario bisnis dunia nyata, tangani pengecualian dengan hati-hati dan hindari mengabaikannya dalam proyek Anda. Pengecualian dalam contoh ini hanya untuk tujuan ilustrasi.
// Pesan kesalahan.
System.out.println(error.getMessage());
// URL untuk pemecahan masalah.
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
public static void main(String[] args_) throws Exception {
// Buat template watermark.
WaterMark.addWaterMarkTemplate();
// Ajukan pekerjaan watermark gambar.
//WaterMark.submitImageWaterMarkJobs();
// Ajukan pekerjaan watermark teks.
//WaterMark.submitTextWaterMarkJobs();
}
}