水印

更新时间:2025-01-13 08:48:04

在视频中添加可见的明水印(例如,企业Logo、电视台台标),可以突出品牌和版权,增加产品识别度。媒体处理支持图片水印动画水印文字水印三种水印类型,您可以按需选择。本文提供了Java SDK为视频添加可见明水印相关功能的API调用示例,包含创建水印模板、提交文字水印作业、提交图片水印作业。

前提条件

使用前请先初始化客户端,详细操作请参见初始化

创建水印模板

水印模板是一系列包含水印位置、大小的参数,使用水印模板,可以帮助您简化开发操作。调用AddWaterMarkTemplate接口,完成水印模板创建。

说明
  • 水印模板只适用于图片水印,不适用于文字水印。

  • 水印模板仅包含水印的位置、大小属性,不包含水印素材。水印素材需要在提交任务时添加。

  • 接口创建模板成功后会返回水印模板ID,您也可以通过MPS控制台创建、获取水印模板,详细说明请参见水印模板

  • 如果您在添加模板时遇到 "The resource "WatermarkTemplate" quota has been used up"错误,代表您的模板配额已用完,可以通过提交工单申请模板数量配额。

/**
     * 创建水印模板
     * @return
     * @throws Exception
     */
    public static void addWaterMarkTemplate() throws Exception {
        com.aliyun.mts20140618.Client client = WaterMark.createClient();
        //水印参数详情, 参考 https://help.aliyun.com/document_detail/29253.htm?spm=a2c4g.602851.0.0.4ab731bckAeLdq#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()
                //水印名称
                .setName("Name")
                //作业输出配置
                .setConfig(waterMarkConfig.toJSONString());

        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.addWaterMarkTemplateWithOptions(addWaterMarkTemplateRequest, runtime);
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

提交水印任务

为视频添加水印会改变画面的内容,需要对视频重新编码。在媒体处理中,您需要调用SubmitJobs接口,提交水印任务。

说明
  • 通过SDK提交作业时,Object需经URLEncode,否则会导致作业失败。详细说明,请参见URL Encoding说明

  • 请按照规范填写文件名称,否则会找不到文件导致作业失败。详细名称规范,请参见参数详情

  • 建议您在提交作业时记录任务的JobID,便于后续进行其他相关操作。

文字水印

/**
     * 提交文字水印转码作业
     * @return
     * @throws Exception
     */
    public static void submitTextWaterMarkJobs() throws Exception {
        com.aliyun.mts20140618.Client client = WaterMark.createClient();
        //构建水印输出配置
        JSONArray waterMarks = new JSONArray();  //水印数组大小上限为4,即同一路输出最多支持4个水印
        //文字水印
        JSONObject textWaterMarks = new JSONObject();
        textWaterMarks.put("WaterMarkTemplateId","<your waterMarkTemplateId>");
        textWaterMarks.put("Type","Text");
        //Content为文字水印内容,内容需做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()
                //作业输入
                .setInput("{\"Bucket\":\"exampleBucket\",\"Location\":\"oss-cn-shanghai\",\"Object\":\"example.flv\",\"Referer\": \"用户自行在OSS控制台设置的OSS防盗链参数\"}")
                //作业输出配置
                .setOutputs("[{\"OutputObject\":\"exampleOutput.mp4\",\"TemplateId\":\"6181666213ab41b9bc21da8ff5ff****\",\"WaterMarks\":" + waterMarks.toJSONString() + ",\"UserData\":\"testid-001\"}]")
                //输出文件所在的OSS Bucket
                .setOutputBucket("exampleBucket")
                //输出文件所在的 OSS Bucket 的地域(OSS Region)
                .setOutputLocation("oss-cn-shanghai")
                //管道ID
                .setPipelineId("dd3dae411e704030b921e52698e5****");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.submitJobsWithOptions(submitJobsRequest, runtime);
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

图片水印

/**
     * 提交图片水印转码作业
     * @return
     * @throws Exception
     */
    public static void submitImageWaterMarkJobs() throws Exception {
        com.aliyun.mts20140618.Client client = WaterMark.createClient();
        //构建水印输出配置
        JSONArray waterMarks = new JSONArray();  //水印数组大小上限为4,即同一路输出最多支持4个水印

        //图片水印
        JSONObject imageWaterMarks = new JSONObject();
        imageWaterMarks.put("WaterMarkTemplateId","<your waterMarkTemplateId>");
        imageWaterMarks.put("Type","Image");
        //图片or动画水印的宽高
        imageWaterMarks.put("Width","200");
        imageWaterMarks.put("Height","100");
        //水印图片路径
        JSONObject logoFile = new JSONObject();
        logoFile.put("Bucket","<your bucket name>");
        logoFile.put("Location","oss-cn-shanghai");
        //图片Object可按需替换为png静态图片、png动图(文件后扩展名需为apng)、mov、gif文件,当素材为非静态图片时,文件扩展名需小写
        logoFile.put("Object", URLEncoder.encode("动态logo.apng", "utf-8"));

        imageWaterMarks.put("InputFile",logoFile.toJSONString());
        waterMarks.add(imageWaterMarks);
        com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
                //作业输入
                .setInput("{\"Bucket\":\"exampleBucket\",\"Location\":\"oss-cn-shanghai\",\"Object\":\"example.flv\",\"Referer\": \"用户自行在OSS控制台设置的OSS防盗链参数\"}")
                //作业输出配置
                .setOutputs("[{\"OutputObject\":\"exampleOutput.mp4\",\"TemplateId\":\"6181666213ab41b9bc21da8ff5ff****\",\"WaterMarks\":" + waterMarks.toJSONString() + ",\"UserData\":\"testid-001\"}]")
                //输出文件所在的OSS Bucket
                .setOutputBucket("exampleBucket")
                //输出文件所在的 OSS Bucket 的地域(OSS Region)
                .setOutputLocation("oss-cn-shanghai")
                //管道ID
                .setPipelineId("dd3dae411e704030b921e52698e5****");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.submitJobsWithOptions(submitJobsRequest, runtime);
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

完整代码

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.tea.TeaException;

import java.net.URLEncoder;

public class WaterMark {
    /**
     * <b>description</b> :
     * <p>使用AK&amp;SK初始化账号Client</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()
                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        config.endpoint = "mts.cn-shanghai.aliyuncs.com";
        return new com.aliyun.mts20140618.Client(config);
    }

    /**
     * 创建水印模板
     * @return
     * @throws Exception
     */
    public static void addWaterMarkTemplate() throws Exception {
        com.aliyun.mts20140618.Client client = WaterMark.createClient();
        //水印参数详情, 参考 https://help.aliyun.com/document_detail/29253.htm?spm=a2c4g.602851.0.0.4ab731bckAeLdq#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()
                //水印名称
                .setName("Name")
                //作业输出配置
                .setConfig(waterMarkConfig.toJSONString());

        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.addWaterMarkTemplateWithOptions(addWaterMarkTemplateRequest, runtime);
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

    /**
     * 提交文字水印转码作业
     * @return
     * @throws Exception
     */
    public static void submitTextWaterMarkJobs() throws Exception {
        com.aliyun.mts20140618.Client client = WaterMark.createClient();
        //构建水印输出配置
        JSONArray waterMarks = new JSONArray();  //水印数组大小上限为4,即同一路输出最多支持4个水印
        //文字水印
        JSONObject textWaterMarks = new JSONObject();
        textWaterMarks.put("WaterMarkTemplateId","<your waterMarkTemplateId>");
        textWaterMarks.put("Type","Text");
        //Content为文字水印内容,内容需做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()
                //作业输入
                .setInput("{\"Bucket\":\"exampleBucket\",\"Location\":\"oss-cn-shanghai\",\"Object\":\"example.flv\",\"Referer\": \"用户自行在OSS控制台设置的OSS防盗链参数\"}")
                //作业输出配置
                .setOutputs("[{\"OutputObject\":\"exampleOutput.mp4\",\"TemplateId\":\"6181666213ab41b9bc21da8ff5ff****\",\"WaterMarks\":" + waterMarks.toJSONString() + ",\"UserData\":\"testid-001\"}]")
                //输出文件所在的OSS Bucket
                .setOutputBucket("exampleBucket")
                //输出文件所在的 OSS Bucket 的地域(OSS Region)
                .setOutputLocation("oss-cn-shanghai")
                //管道ID
                .setPipelineId("dd3dae411e704030b921e52698e5****");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.submitJobsWithOptions(submitJobsRequest, runtime);
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

    /**
     * 提交图片水印转码作业
     * @return
     * @throws Exception
     */
    public static void submitImageWaterMarkJobs() throws Exception {
        com.aliyun.mts20140618.Client client = WaterMark.createClient();
        //构建水印输出配置
        JSONArray waterMarks = new JSONArray();  //水印数组大小上限为4,即同一路输出最多支持4个水印

        //图片水印
        JSONObject imageWaterMarks = new JSONObject();
        imageWaterMarks.put("WaterMarkTemplateId","<your waterMarkTemplateId>");
        imageWaterMarks.put("Type","Image");
        //图片or动画水印的宽高
        imageWaterMarks.put("Width","200");
        imageWaterMarks.put("Height","100");
        //水印图片路径
        JSONObject logoFile = new JSONObject();
        logoFile.put("Bucket","<your bucket name>");
        logoFile.put("Location","oss-cn-shanghai");
        //图片Object可按需替换为png静态图片、png动图(文件后扩展名需为apng)、mov、gif文件,当素材为非静态图片时,文件扩展名需小写
        logoFile.put("Object", URLEncoder.encode("动态logo.apng", "utf-8"));

        imageWaterMarks.put("InputFile",logoFile.toJSONString());
        waterMarks.add(imageWaterMarks);
        com.aliyun.mts20140618.models.SubmitJobsRequest submitJobsRequest = new com.aliyun.mts20140618.models.SubmitJobsRequest()
                //作业输入
                .setInput("{\"Bucket\":\"exampleBucket\",\"Location\":\"oss-cn-shanghai\",\"Object\":\"example.flv\",\"Referer\": \"用户自行在OSS控制台设置的OSS防盗链参数\"}")
                //作业输出配置
                .setOutputs("[{\"OutputObject\":\"exampleOutput.mp4\",\"TemplateId\":\"6181666213ab41b9bc21da8ff5ff****\",\"WaterMarks\":" + waterMarks.toJSONString() + ",\"UserData\":\"testid-001\"}]")
                //输出文件所在的OSS Bucket
                .setOutputBucket("exampleBucket")
                //输出文件所在的 OSS Bucket 的地域(OSS Region)
                .setOutputLocation("oss-cn-shanghai")
                //管道ID
                .setPipelineId("dd3dae411e704030b921e52698e5****");
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.submitJobsWithOptions(submitJobsRequest, runtime);
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
    }

    public static void main(String[] args_) throws Exception {
        //创建水印模板
        WaterMark.addWaterMarkTemplate();
        //提交图片水印任务
        //WaterMark.submitImageWaterMarkJobs();
        //提交文字水印任务
        //WaterMark.submitTextWaterMarkJobs();

    }
}

相关文档

  • 本页导读 (1)
  • 前提条件
  • 创建水印模板
  • 提交水印任务
  • 文字水印
  • 图片水印
  • 完整代码
  • 相关文档
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等