阿里雲視頻點播添加水印功能實踐


  1. 添加阿里雲點播所需要的依賴

 <dependency>
           <groupId>com.aliyun</groupId>
           <artifactId>aliyun-java-sdk-core</artifactId>
           <version>4.5.1</version>
       </dependency>
       <dependency>
           <groupId>com.aliyun</groupId>
           <artifactId>aliyun-java-vod-upload</artifactId>
           <version>1.4.13</version>
       </dependency>
       <dependency>
           <groupId>com.aliyun</groupId>
           <artifactId>aliyun-java-sdk-vod</artifactId>
           <version>2.15.11</version>
       </dependency>

       <dependency>
           <groupId>com.google.code.gson</groupId>
           <artifactId>gson</artifactId>
           <version>2.8.2</version>
       </dependency>
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.68</version>
       </dependency>
       <dependency>
           <groupId>org.json</groupId>
           <artifactId>json</artifactId>
           <version>20171018</version>
       </dependency>

其中aliyun-java-vod-upload還沒有開源,需要自行下載阿里雲點播視頻上傳demo,將jar包打入本地的maven倉庫。

  1. 圖片水印獲取上傳的地址和授權(文字水印不需要此步驟)

  DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "keyid", "secret");
IAcsClient client = new DefaultAcsClient(profile);
/*
           圖片型的水印才有的步驟 1 發請求獲取圖片水印的存放地址和臨時授權
        */
       CreateUploadAttachedMediaRequest request = new CreateUploadAttachedMediaRequest();
       //上傳水印文件設置watermark即可
       request.setBusinessType("watermark");
       //水印文件在本地的文件名稱
       request.setFileName("watermark.png");
       //水印文件的擴展名(png、gif、apng、mov)
       request.setMediaExt("png");
       //水印文件對應的標題
       request.setTitle("水印文件");
try {
CreateUploadAttachedMediaResponse response = client.getAcsResponse(request);
System.out.println(new Gson().toJson(response));
        } catch (ServerException  e) {
               e.printStackTrace();
      }catch (IOException e){
           e.printStackTrace();
      }
       catch (ClientException e){
       System.out.println("ErrCode:" + e.getErrCode());
       System.out.println("ErrMsg:" + e.getErrMsg());
       System.out.println("RequestId:" + e.getRequestId());
      }
  1. 上傳水印圖片

            //文件存儲到OSS的名稱
           fileName = (String) address.get("FileName");
           //OSS存儲文件的bucket
           bucket = (String) address.get("Bucket");
           endpoint = (String) address.get("Endpoint");
           accessKeyId = (String) auth.get("AccessKeyId");
           accessKeySecrect = (String) auth.get("AccessKeySecret");
           //OSS上傳token
           securityToken = (String) auth.get("SecurityToken");
            /**
        * 上傳水印文件到 aliyun
        */
       try {
           File file = new File("C:\\Users\\54719\\Desktop\\zhaopian\\watermark.png");
           //上傳水印文件
           OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecrect, securityToken);
           //將水印文件上傳到OSS
           ossClient.putObject(bucket, fileName, file);
           //上傳完成后務必關閉oss client
           ossClient.shutdown();
      }catch (Exception e){
           e.printStackTrace();
      }
  1. 創建水印模板(文字水印可以從這部開始)

/**
        * 添加水印模板
        */
       AddWatermarkRequest re = new AddWatermarkRequest();
       //水印名稱
       re.setName("test");
       //調用獲取文件上傳路徑和憑證接口返回的FileURL
       //圖片水印必傳圖片文件的oss文件地址,水印文件必須和視頻在同一個區域,例如:華東2視頻,水印文件必須存放在華東2
       re.setFileUrl(fileUrl);
       //文字水印:Text; 圖片水印:Image
       re.setType("Image");
       //水印配置信息(構建水印配置信息方法,詳細的構建邏輯請參考接口SDK示例。)
       JSONObject watermarkConfig = buildWatermarkConfig();
       re.setWatermarkConfig(watermarkConfig.toJSONString());
try {
           /**
            * 添加水印模板后返回
            */
        AddWatermarkResponse response = client.getAcsResponse(re);
        System.out.println(new Gson().toJson(response));
        String warterId = response.getWatermarkInfo().getWatermarkId();
        } catch (ServerException e) {
           e.printStackTrace();
      } catch (ClientException e) {
           System.out.println("ErrCode:" + e.getErrCode());
           System.out.println("ErrMsg:" + e.getErrMsg());
           System.out.println("RequestId:" + e.getRequestId());
      }

   public static JSONObject buildWatermarkConfig(){
       JSONObject ob = new JSONObject();
       ob.put("Width","55");
       ob.put("Height","55");
       ob.put("Dx","20");
       ob.put("Dy","20");
       ob.put("ReferPos","TopLeft");
       ob.put("Type","Image");

       return ob;
  }
  1. 生成轉碼模板並關聯水印模板

  try {

               AddTranscodeTemplateGroupRequest req = new AddTranscodeTemplateGroupRequest();

               req.setName("水印組12");
               req.setRegionId("cn-shanghai");
               req.setTranscodeTemplateGroupId("8fc34c6bfabdf2cc353ffef5377c3fcb");

               //re.setAppId();
               JSONArray transcodeTemplateList = buildTranscodeTemplateList(warterId);
               req.setTranscodeTemplateList(transcodeTemplateList.toString());
               AddTranscodeTemplateGroupResponse res = client.getAcsResponse(req);
               System.out.println(new Gson().toJson(res));
          } catch (JSONException e) {
               e.printStackTrace();
          }
           catch (ClientException e){
               System.out.println("ErrCode:" + e.getErrCode());
               System.out.println("ErrMsg:" + e.getErrMsg());
               System.out.println("RequestId:" + e.getRequestId());
          }


public static JSONArray buildTranscodeTemplateList(String warterId) throws JSONException {

       JSONArray transcodeTemplateList = new JSONArray();
       org.json.JSONObject transcodeTemplate = new org.json.JSONObject();
       //清晰度
       transcodeTemplate.put("Definition", "OD");
       //模板名稱
       transcodeTemplate.put("TemplateName", "tupian");
       //視頻流轉碼配置
       org.json.JSONObject video = new org.json.JSONObject();
       video.put("Width", 640);
       video.put("Bitrate", 400);
       //video.put("Fps", 25);
       video.put("Remove", false);
       video.put("Codec", "H.264");
       video.put("Gop", "250");
       transcodeTemplate.put("Video", video);


       //音頻流轉碼配置
       org.json.JSONObject audio = new org.json.JSONObject();
       audio.put("Codec", "AAC");
       audio.put("Bitrate", "64");
       audio.put("Channels", "2");
       audio.put("Samplerate", "32000");
       transcodeTemplate.put("Audio", audio);

       //封裝容器
       org.json.JSONObject container = new org.json.JSONObject();
       container.put("Format", "mp4");
       transcodeTemplate.put("Container", container);
       org.json.JSONObject mux = new org.json.JSONObject();
       org.json.JSONObject seg = new org.json.JSONObject();
       seg.put("Duration","6");
       mux.put("Segment",seg);
       transcodeTemplate.put("MuxConfig",mux);
       //條件轉碼配置
       org.json.JSONObject transconfig = new org.json.JSONObject();
       transconfig.put("IsCheckReso", false);
       transconfig.put("IsCheckResoFail", false);
       transconfig.put("IsCheckVideoBitrate", false);
       transconfig.put("IsCheckVideoBitrateFail", false);
       transconfig.put("IsCheckAudioBitrate", false);
       transconfig.put("IsCheckAudioBitrateFail", false);
       transcodeTemplate.put("TransConfig", transconfig);

       //需要使用的水印ID(多水印關聯),最多支持4個水印
       JSONArray watermarkIdList = new JSONArray();
       //watermarkIdList.
       watermarkIdList.put(warterId);
       //USER_DEFAULT_WATERMARK 代表默認水印ID
       transcodeTemplate.put("WatermarkIds", watermarkIdList);

       transcodeTemplateList.put(transcodeTemplate);
       return transcodeTemplateList;
  }
  1. 通過4可以獲取到轉碼模板id,點播上傳時關聯上轉碼模板id即可

 /**
    * 本地文件上傳接口
    *
    * @param accessKeyId
    * @param accessKeySecret
    * @param title
    * @param fileName
    */
   private static void testUploadVideo(String accessKeyId, String accessKeySecret, String title, String fileName) {
       UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName);
       /* 可指定分片上傳時每個分片的大小,默認為2M字節 */
       request.setPartSize(2 * 1024 * 1024L);
       /* 可指定分片上傳時的並發線程數,默認為1,(注:該配置會占用服務器CPU資源,需根據服務器情況指定)*/
       request.setTaskNum(1);
       /* 是否開啟斷點續傳, 默認斷點續傳功能關閉。當網絡不穩定或者程序崩潰時,再次發起相同上傳請求,可以繼續未完成的上傳任務,適用於超時3000秒仍不能上傳完成的大文件。
       注意: 斷點續傳開啟后,會在上傳過程中將上傳位置寫入本地磁盤文件,影響文件上傳速度,請您根據實際情況選擇是否開啟*/
       //request.setEnableCheckpoint(false);
       /* OSS慢請求日志打印超時時間,是指每個分片上傳時間超過該閾值時會打印debug日志,如果想屏蔽此日志,請調整該閾值。單位: 毫秒,默認為300000毫秒*/
       //request.setSlowRequestsThreshold(300000L);
       /* 可指定每個分片慢請求時打印日志的時間閾值,默認為300s*/
       //request.setSlowRequestsThreshold(300000L);
       /* 是否顯示水印(可選),指定模板組ID時,根據模板組配置確定是否顯示水印*/
       request.setIsShowWaterMark(true);
       /* 自定義消息回調設置(可選),參數說明參考文檔 https://help.aliyun.com/document_detail/86952.html#UserData */
       // request.setUserData("{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackURL\":\"http://test.test.com\"}}");
       /* 視頻分類ID(可選) */
       request.setCateId(1000209170l);
       /* 視頻標簽,多個用逗號分隔(可選) */
       //request.setTags("標簽1,標簽2");
       /* 視頻描述(可選) */
       //request.setDescription("視頻描述");
       /* 封面圖片(可選) */
       //request.setCoverURL("http://cover.sample.com/sample.jpg");
       /* 模板組ID(可選) */
       request.setTemplateGroupId("groupId");
       /* 工作流ID(可選) */
       //request.setWorkflowId("d4430d07361f0*be1339577859b0177b");
       /* 存儲區域(可選) */
       //request.setStorageLocation("in-201703232118266-5sejdln9o.oss-cn-shanghai.aliyuncs.com");
       /* 開啟默認上傳進度回調 */
       //request.setPrintProgress(false);
       /* 設置自定義上傳進度回調 (必須繼承 VoDProgressListener) */
       //request.setProgressListener(new PutObjectProgressListener());
       /* 設置您實現的生成STS信息的接口實現類*/
       // request.setVoDRefreshSTSTokenListener(new RefreshSTSTokenImpl());
       /* 設置應用ID*/
       //request.setAppId("app-1000000");
       /* 點播服務接入點 */
       //request.setApiRegionId("cn-shanghai");
       /* ECS部署區域*/
       // request.setEcsRegionId("cn-shanghai");
       UploadVideoImpl uploader = new UploadVideoImpl();
       UploadVideoResponse response = uploader.uploadVideo(request);
       System.out.print("RequestId=" + response.getRequestId() + "\n");  //請求視頻點播服務的請求ID
       if (response.isSuccess()) {
           System.out.print("VideoId=" + response.getVideoId() + "\n");
      } else {
           /* 如果設置回調URL無效,不影響視頻上傳,可以返回VideoId同時會返回錯誤碼。其他情況上傳失敗時,VideoId為空,此時需要根據返回錯誤碼分析具體錯誤原因 */
           System.out.print("VideoId=" + response.getVideoId() + "\n");
           System.out.print("ErrorCode=" + response.getCode() + "\n");
           System.out.print("ErrorMessage=" + response.getMessage() + "\n");
      }
  }


/**
    * 流式上傳接口
    *
    * @param accessKeyId
    * @param accessKeySecret
    * @param title
    * @param fileName
    * @param inputStream
    */
   private static void testUploadStream(String accessKeyId, String accessKeySecret, String title, String fileName, InputStream inputStream) {
       UploadStreamRequest request = new UploadStreamRequest(accessKeyId, accessKeySecret, title, fileName, inputStream);
        /* 是否使用默認水印(可選),指定模板組ID時,根據模板組配置確定是否使用默認水印*/
       //request.setShowWaterMark(true);
       /* 自定義消息回調設置,參數說明參考文檔 https://help.aliyun.com/document_detail/86952.html#UserData */
       //request.setUserData(""{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackURL\":\"http://test.test.com\"}}"");
       /* 視頻分類ID(可選) */
       //request.setCateId(0);
       /* 視頻標簽,多個用逗號分隔(可選) */
       //request.setTags("標簽1,標簽2");
       /* 視頻描述(可選) */
       //request.setDescription("視頻描述");
       /* 封面圖片(可選) */
       //request.setCoverURL("http://cover.sample.com/sample.jpg");
       /* 模板組ID(可選) */
       //request.setTemplateGroupId("8c4792cbc8694e7084fd5330e56a33d");
       /* 工作流ID(可選) */
       //request.setWorkflowId("d4430d07361f0*be1339577859b0177b");
       /* 存儲區域(可選) */
       //request.setStorageLocation("in-201703232118266-5sejdln9o.oss-cn-shanghai.aliyuncs.com");
       /* 開啟默認上傳進度回調 */
       // request.setPrintProgress(true);
       /* 設置自定義上傳進度回調 (必須繼承 VoDProgressListener) */
       // request.setProgressListener(new PutObjectProgressListener());
        /* 設置應用ID*/
       //request.setAppId("app-1000000");
       /* 點播服務接入點 */
       //request.setApiRegionId("cn-shanghai");
       /* ECS部署區域*/
       // request.setEcsRegionId("cn-shanghai");
       UploadVideoImpl uploader = new UploadVideoImpl();
       UploadStreamResponse response = uploader.uploadStream(request);
       System.out.print("RequestId=" + response.getRequestId() + "\n");  //請求視頻點播服務的請求ID
       if (response.isSuccess()) {
           System.out.print("VideoId=" + response.getVideoId() + "\n");
      } else { //如果設置回調URL無效,不影響視頻上傳,可以返回VideoId同時會返回錯誤碼。其他情況上傳失敗時,VideoId為空,此時需要根據返回錯誤碼分析具體錯誤原因
           System.out.print("VideoId=" + response.getVideoId() + "\n");
           System.out.print("ErrorCode=" + response.getCode() + "\n");
           System.out.print("ErrorMessage=" + response.getMessage() + "\n");
      }
  }

阿里雲點播視頻上傳可以參考官方的demo下載地址 http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/51992/cn_zh/1600848199952/VODUploadDemo-java-1.4.13.zip

純手寫,可能不全面,有問題還請指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM