本文介紹了如何使用Java SDK視頻審核接口,檢測視頻中是否包含風險內容。
功能描述
前提條件
安裝Java依賴。關于安裝Java依賴的具體操作,請參見安裝Java依賴。
說明請一定按照安裝Java依賴頁面中的版本安裝,否則會導致調用失敗。
如果使用本地文件或者二進制文件檢測,請下載并在項目工程中引入Extension.Uploader工具類。
(推薦)提交視頻異步檢測任務
接口 | 描述 | 支持的地域 |
VideoAsyncScanRequest | 提交視頻異步檢測任務,對視頻進行多個風險場景的識別,包括色情、暴恐涉政、廣告 、不良場景、Logo(商標臺標)識別。 |
|
示例代碼
傳視頻URL進行檢測
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.green.model.v20180509.VideoAsyncScanRequest; import com.aliyuncs.http.FormatType; import com.aliyuncs.http.HttpResponse; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.UUID; public class Main { public static void main(String[] args) throws Exception { /** * 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。 * 常見獲取環境變量方式: * 方式一: * 獲取RAM用戶AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); * 獲取RAM用戶AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); * 方式二: * 獲取RAM用戶AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID"); * 獲取RAM用戶AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); */ DefaultProfile profile = DefaultProfile.getProfile( "cn-shanghai", "建議從環境變量中獲取RAM用戶AccessKey ID", "建議從環境變量中獲取RAM用戶AccessKey Secret"); DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com"); // 注意:此處實例化的client盡可能重復使用,提升檢測性能。避免重復建立連接。 IAcsClient client = new DefaultAcsClient(profile); VideoAsyncScanRequest videoAsyncScanRequest = new VideoAsyncScanRequest(); videoAsyncScanRequest.setAcceptFormat(FormatType.JSON); // 指定API返回格式。 videoAsyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定請求方法。 List<Map<String, Object>> tasks = new ArrayList<Map<String, Object>>(); Map<String, Object> task = new LinkedHashMap<String, Object>(); task.put("dataId", UUID.randomUUID().toString()); task.put("url", "請填寫公網可訪問的視頻HTTP、HTTPS URL地址"); tasks.add(task); /** * 設置要檢測的場景。計費是依據此處傳遞的場景計算。 * 視頻默認1秒截取一幀,您可以自行控制截幀頻率。收費按照視頻的截幀數量以及每一幀的檢測場景計算。 * 舉例:1分鐘的視頻截幀60張,檢測色情(對應場景參數porn)和暴恐涉政(對應場景參數terrorism)2個場景,收費按照60張色情+60張暴恐涉政進行計費。 */ JSONObject data = new JSONObject(); data.put("scenes", Arrays.asList("porn", "terrorism")); data.put("tasks", tasks); data.put("callback", "http://www.aliyundoc.com/xxx.json"); data.put("seed", "yourPersonalSeed"); videoAsyncScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON); /** * 請務必設置超時時間。 */ videoAsyncScanRequest.setConnectTimeout(3000); videoAsyncScanRequest.setReadTimeout(6000); try { HttpResponse httpResponse = client.doAction(videoAsyncScanRequest); if (httpResponse.isSuccess()) { JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8")); System.out.println(JSON.toJSONString(scrResponse, true)); int requestCode = scrResponse.getIntValue("code"); // 每一個視頻的檢測結果。 JSONArray taskResults = scrResponse.getJSONArray("data"); if (200 == requestCode) { for (Object taskResult : taskResults) { // 單個視頻的處理結果。 int taskCode = ((JSONObject) taskResult).getIntValue("code"); if (200 == taskCode) { // 保存taskId用于輪詢結果。 System.out.println(((JSONObject) taskResult).getString("taskId")); } else { // 單個視頻處理失敗,原因視具體的情況詳細分析。 System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult)); } } } else { /** * 表明請求整體處理失敗,原因視具體的情況詳細分析。 */ System.out.println("the whole scan request failed. response:" + JSON.toJSONString(scrResponse)); } } else { System.out.println("response not success. status:" + httpResponse.getStatus()); } } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }
傳本地視頻文件進行檢測
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.green.extension.uploader.ClientUploader; import com.aliyuncs.green.model.v20180509.VideoAsyncScanRequest; import com.aliyuncs.http.FormatType; import com.aliyuncs.http.HttpResponse; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.UUID; public class Main { public static void main(String[] args) throws Exception { /** * 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。 * 常見獲取環境變量方式: * 方式一: * 獲取RAM用戶AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); * 獲取RAM用戶AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); * 方式二: * 獲取RAM用戶AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID"); * 獲取RAM用戶AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); */ DefaultProfile profile = DefaultProfile.getProfile( "cn-shanghai", "建議從環境變量中獲取RAM用戶AccessKey ID", "建議從環境變量中獲取RAM用戶AccessKey Secret"); DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com"); // 注意:此處實例化的client盡可能重復使用,提升檢測性能。避免重復建立連接。 IAcsClient client = new DefaultAcsClient(profile); VideoAsyncScanRequest videoAsyncScanRequest = new VideoAsyncScanRequest(); videoAsyncScanRequest.setAcceptFormat(FormatType.JSON); // 指定API返回格式。 videoAsyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定請求方法。 /** * 如果您要檢測的文件存儲在本地服務器上,可以通過下述代碼生成URL作為視頻地址傳遞到服務端進行檢測。 */ String url = null; ClientUploader uploader = ClientUploader.getVideoClientUploader(profile, false); try { url = uploader.uploadFile("您的本地文件的絕對路徑"); } catch (Exception e) { e.printStackTrace(); } List<Map<String, Object>> tasks = new ArrayList<Map<String, Object>>(); Map<String, Object> task = new LinkedHashMap<String, Object>(); task.put("dataId", UUID.randomUUID().toString()); task.put("url", url); tasks.add(task); /** * 設置要檢測的場景。計費是依據此處傳遞的場景計算。 * 視頻默認1秒截取一幀,您可以自行控制截幀頻率。收費按照視頻的截幀數量以及每一幀的檢測場景進行計算。 * 舉例:1分鐘的視頻截幀60張,檢測色情(對應場景參數porn)和暴恐涉政(對應場景參數terrorism)2個場景,收費按照60張色情+60張暴恐涉政進行計算。 */ JSONObject data = new JSONObject(); data.put("scenes", Arrays.asList("porn", "terrorism")); data.put("tasks", tasks); data.put("callback", "http://www.aliyundoc.com/xxx.json"); data.put("seed", "yourPersonalSeed"); videoAsyncScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON); /** * 請務必設置超時時間。 */ videoAsyncScanRequest.setConnectTimeout(3000); videoAsyncScanRequest.setReadTimeout(10000); try { HttpResponse httpResponse = client.doAction(videoAsyncScanRequest); if (httpResponse.isSuccess()) { JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8")); System.out.println(JSON.toJSONString(scrResponse, true)); int requestCode = scrResponse.getIntValue("code"); // 每一個視頻的檢測結果。 JSONArray taskResults = scrResponse.getJSONArray("data"); if (200 == requestCode) { for (Object taskResult : taskResults) { // 單個視頻的處理結果。 int taskCode = ((JSONObject) taskResult).getIntValue("code"); if (200 == taskCode) { // 保存taskId用于輪詢結果。 System.out.println(((JSONObject) taskResult).getString("taskId")); } else { // 單個視頻處理失敗,原因視具體的情況詳細分析。 System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult)); } } } else { /** * 表明請求整體處理失敗,原因視具體的情況詳細分析。 */ System.out.println("the whole image scan request failed. response:" + JSON.toJSONString(scrResponse)); } } else { System.out.println("response not success. status:" + httpResponse.getStatus()); } } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }
傳視頻文件二進制數據進行檢測
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.green.extension.uploader.ClientUploader; import com.aliyuncs.green.model.v20180509.VideoAsyncScanRequest; import com.aliyuncs.http.FormatType; import com.aliyuncs.http.HttpResponse; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import org.apache.commons.io.FileUtils; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.UUID; public class Main { public static void main(String[] args) throws Exception { /** * 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。 * 常見獲取環境變量方式: * 方式一: * 獲取RAM用戶AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); * 獲取RAM用戶AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); * 方式二: * 獲取RAM用戶AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID"); * 獲取RAM用戶AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); */ DefaultProfile profile = DefaultProfile.getProfile( "cn-shanghai", "建議從環境變量中獲取RAM用戶AccessKey ID", "建議從環境變量中獲取RAM用戶AccessKey Secret"); DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com"); // 注意:此處實例化的client盡可能重復使用,提升檢測性能。避免重復建立連接。 IAcsClient client = new DefaultAcsClient(profile); VideoAsyncScanRequest videoAsyncScanRequest = new VideoAsyncScanRequest(); videoAsyncScanRequest.setAcceptFormat(FormatType.JSON); // 指定API返回格式。 videoAsyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定請求方法。 /** * 如果您要檢測的文件存儲在本地服務器上,可以通過下述代碼生成URL作為視頻地址傳遞到服務端進行檢測。 */ ClientUploader uploader = ClientUploader.getVideoClientUploader(profile, false); byte[] videoBytes = null; String url = null; try { // 讀取本地文件作為二進制數據當做輸入做為示例。實際使用中請直接替換成您的視頻二進制數據。 videoBytes = FileUtils.readFileToByteArray(new File("您的本地文件路徑")); // 上傳到服務端。 url = uploader.uploadBytes(videoBytes); } catch (Exception e) { System.out.println("upload file to server fail." + e.toString()); } List<Map<String, Object>> tasks = new ArrayList<Map<String, Object>>(); Map<String, Object> task = new LinkedHashMap<String, Object>(); task.put("dataId", UUID.randomUUID().toString()); task.put("url", url); tasks.add(task); /** * 設置要檢測的場景。計費依據此處傳遞的場景計算。 * 視頻默認1秒截取一幀,您可以自行控制截幀頻率。收費按照視頻的截幀數量以及每一幀的檢測場景進行計算。 * 舉例:1分鐘的視頻截幀60張,檢測色情(對應場景參數porn)和暴恐涉政(對應場景參數terrorism)2個場景,收費按照60張色情+60張暴恐涉政進行計算。 */ JSONObject data = new JSONObject(); data.put("scenes", Arrays.asList("porn", "terrorism")); data.put("tasks", tasks); data.put("callback", "http://www.aliyundoc.com/xxx.json"); data.put("seed", "yourPersonalSeed"); videoAsyncScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON); /** * 請務必設置超時時間。 */ videoAsyncScanRequest.setConnectTimeout(3000); videoAsyncScanRequest.setReadTimeout(10000); try { HttpResponse httpResponse = client.doAction(videoAsyncScanRequest); if (httpResponse.isSuccess()) { JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8")); System.out.println(JSON.toJSONString(scrResponse, true)); int requestCode = scrResponse.getIntValue("code"); // 每一個視頻的檢測結果。 JSONArray taskResults = scrResponse.getJSONArray("data"); if (200 == requestCode) { for (Object taskResult : taskResults) { // 單個視頻的處理結果。 int taskCode = ((JSONObject) taskResult).getIntValue("code"); if (200 == taskCode) { // 保存taskId用于輪詢結果。 System.out.println(((JSONObject) taskResult).getString("taskId")); } else { // 單個視頻處理失敗,原因視具體的情況詳細分析。 System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult)); } } } else { /** * 表明請求整體處理失敗,原因視具體的情況詳細分析。 */ System.out.println("the whole scan request failed. response:" + JSON.toJSONString(scrResponse)); } } else { System.out.println("response not success. status:" + httpResponse.getStatus()); } } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }
傳視頻直播流進行檢測
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.green.model.v20180509.VideoAsyncScanRequest; import com.aliyuncs.http.FormatType; import com.aliyuncs.http.HttpResponse; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) throws Exception { /** * 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。 * 常見獲取環境變量方式: * 方式一: * 獲取RAM用戶AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); * 獲取RAM用戶AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); * 方式二: * 獲取RAM用戶AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID"); * 獲取RAM用戶AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); */ DefaultProfile profile = DefaultProfile.getProfile( "cn-shanghai", "建議從環境變量中獲取RAM用戶AccessKey ID", "建議從環境變量中獲取RAM用戶AccessKey Secret"); DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com"); // 注意:此處實例化的client盡可能重復使用,提升檢測性能。避免重復建立連接。 IAcsClient client = new DefaultAcsClient(profile); VideoAsyncScanRequest videoAsyncScanRequest = new VideoAsyncScanRequest(); videoAsyncScanRequest.setAcceptFormat(FormatType.JSON); // 指定API返回格式。 videoAsyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定請求方法。 List<Map<String, Object>> tasks = new ArrayList<Map<String, Object>>(); Map<String, Object> task = new LinkedHashMap<String, Object>(); task.put("dataId", "業務ID"); // URL填寫直播流地址。 task.put("url", "待檢測視頻鏈接地址"); tasks.add(task); /** * 設置要檢測的場景。計費依據此處傳遞的場景計算。 * 視頻默認1秒截取一幀,您可以自行控制截幀頻率。收費按照視頻的截幀數量以及每一幀的檢測場景進行計算。 * 舉例:1分鐘的視頻截幀60張,檢測色情(對應場景參數porn)和暴恐涉政(對應場景參數terrorism)2個場景,收費按照60張色情+60張暴恐涉政進行計算。 */ JSONObject data = new JSONObject(); data.put("scenes", Arrays.asList("porn", "terrorism")); data.put("live", true); data.put("tasks", tasks); data.put("callback", "您的回調地址"); data.put("seed", "yourPersonalSeed"); videoAsyncScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON); /** * 請務必設置超時時間。 */ videoAsyncScanRequest.setConnectTimeout(3000); videoAsyncScanRequest.setReadTimeout(10000); try { HttpResponse httpResponse = client.doAction(videoAsyncScanRequest); if (httpResponse.isSuccess()) { JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8")); System.out.println(JSON.toJSONString(scrResponse, true)); int requestCode = scrResponse.getIntValue("code"); // 每一個視頻的檢測結果。 JSONArray taskResults = scrResponse.getJSONArray("data"); if (200 == requestCode) { for (Object taskResult : taskResults) { // 單個視頻的處理結果。 int taskCode = ((JSONObject) taskResult).getIntValue("code"); if (200 == taskCode) { // 保存taskId用于輪詢結果。 System.out.println(((JSONObject) taskResult).getString("taskId")); } else { // 單個視頻處理失敗,原因視具體的情況詳細分析。 System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult)); } } } else { /** * 表明請求整體處理失敗,原因視具體的情況詳細分析。 */ System.out.println("the whole scan request failed. response:" + JSON.toJSONString(scrResponse)); } } else { System.out.println("response not success. status:" + httpResponse.getStatus()); } } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }
傳視頻語音進行綜合檢測
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.green.model.v20180509.VideoAsyncScanRequest; import com.aliyuncs.http.FormatType; import com.aliyuncs.http.HttpResponse; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) throws Exception { /** * 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。 * 常見獲取環境變量方式: * 方式一: * 獲取RAM用戶AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); * 獲取RAM用戶AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); * 方式二: * 獲取RAM用戶AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID"); * 獲取RAM用戶AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); */ DefaultProfile profile = DefaultProfile.getProfile( "cn-shanghai", "建議從環境變量中獲取RAM用戶AccessKey ID", "建議從環境變量中獲取RAM用戶AccessKey Secret"); DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com"); // 注意:此處實例化的client盡可能重復使用,提升檢測性能。避免重復建立連接。 IAcsClient client = new DefaultAcsClient(profile); VideoAsyncScanRequest videoAsyncScanRequest = new VideoAsyncScanRequest(); videoAsyncScanRequest.setAcceptFormat(FormatType.JSON); // 指定API返回格式。 videoAsyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定請求方法。 List<Map<String, Object>> tasks = new ArrayList<Map<String, Object>>(); Map<String, Object> task = new LinkedHashMap<String, Object>(); task.put("dataId", "業務數據ID"); // URL填寫直播流地址。 task.put("url", "待檢測的視頻鏈接地址"); tasks.add(task); /** * 設置要檢測的場景。計費依據此處傳遞的場景計算。 * 視頻默認1秒截取一幀,您可以自行控制截幀頻率。收費按照視頻的截幀數量以及每一幀的檢測場景進行計算。 * 舉例:1分鐘的視頻截幀60張,檢測色情(對應場景參數porn)和暴恐涉政(對應場景參數terrorism)2個場景,收費按照60張色情+60張暴恐涉政進行計費。 */ JSONObject data = new JSONObject(); data.put("scenes", Arrays.asList("porn", "terrorism")); data.put("live", true); data.put("tasks", tasks); data.put("callback", "您的回調地址"); data.put("seed", "yourPersonalSeed"); /** * 如果檢測視頻畫面的同時需要檢測語音是否有風險內容,傳遞以下參數。 * 注意語音的計費是按照時長進行,即該視頻的時長*語音反垃圾的單價。 */ data.put("audioScenes", Arrays.asList("antispam")); videoAsyncScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON); /** * 請務必設置超時時間。 */ videoAsyncScanRequest.setConnectTimeout(3000); videoAsyncScanRequest.setReadTimeout(10000); try { HttpResponse httpResponse = client.doAction(videoAsyncScanRequest); if (httpResponse.isSuccess()) { JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8")); System.out.println(JSON.toJSONString(scrResponse, true)); int requestCode = scrResponse.getIntValue("code"); // 每一個視頻的檢測結果。 JSONArray taskResults = scrResponse.getJSONArray("data"); if (200 == requestCode) { for (Object taskResult : taskResults) { // 單個視頻的處理結果。 int taskCode = ((JSONObject) taskResult).getIntValue("code"); if (200 == taskCode) { // 保存taskId,用于輪詢結果。 System.out.println(((JSONObject) taskResult).getString("taskId")); } else { // 單個視頻處理失敗,原因視具體的情況詳細分析。 System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult)); } } } else { /** * 表明請求整體處理失敗,原因視具體的情況詳細分析。 */ System.out.println("the whole scan request failed. response:" + JSON.toJSONString(scrResponse)); } } else { System.out.println("response not success. status:" + httpResponse.getStatus()); } } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }
查詢視頻異步檢測結果
接口 | 描述 | 支持的地域 |
VideoAsyncScanResultsRequest | 查詢視頻異步檢測任務的結果。 說明 該方法需要輪詢結果,建議使用callback的方式獲取結果。 |
|
示例代碼
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.green.model.v20180509.VideoAsyncScanResultsRequest;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.HttpResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
/**
* 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。
* 常見獲取環境變量方式:
* 方式一:
* 獲取RAM用戶AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 獲取RAM用戶AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
* 方式二:
* 獲取RAM用戶AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 獲取RAM用戶AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
*/
DefaultProfile profile = DefaultProfile.getProfile(
"cn-shanghai",
"建議從環境變量中獲取RAM用戶AccessKey ID",
"建議從環境變量中獲取RAM用戶AccessKey Secret");
DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com");
// 注意:此處實例化的client盡可能重復使用,提升檢測性能。避免重復建立連接。
IAcsClient client = new DefaultAcsClient(profile);
VideoAsyncScanResultsRequest videoAsyncScanResultsRequest = new VideoAsyncScanResultsRequest();
videoAsyncScanResultsRequest.setAcceptFormat(FormatType.JSON);
List<String> taskList = new ArrayList<String>();
// 這里添加要查詢的taskId。提交任務的時候需要自行保存taskId。
taskList.add("視頻檢測任務ID");
videoAsyncScanResultsRequest.setHttpContent(JSON.toJSONString(taskList).getBytes("UTF-8"), "UTF-8", FormatType.JSON);
/**
* 請務必設置超時時間。
*/
videoAsyncScanResultsRequest.setConnectTimeout(3000);
videoAsyncScanResultsRequest.setReadTimeout(6000);
try {
HttpResponse httpResponse = client.doAction(videoAsyncScanResultsRequest);
if (httpResponse.isSuccess()) {
JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
System.out.println(JSON.toJSONString(scrResponse, true));
int requestCode = scrResponse.getIntValue("code");
// 每一個視頻的檢測結果。
JSONArray taskResults = scrResponse.getJSONArray("data");
if (200 == requestCode) {
for (Object taskResult : taskResults) {
// 單個視頻的處理結果。
int taskCode = ((JSONObject) taskResult).getIntValue("code");
if (280 == taskCode) {
// 檢測中。
// taskId。
System.out.println(((JSONObject) taskResult).getString("taskId"));
} else if (200 == taskCode) {
// taskId。
System.out.println(((JSONObject) taskResult).getString("taskId"));
// 檢測結果。
JSONArray results = ((JSONObject) taskResult).getJSONArray("results");
for (Object result : results) {
// 視頻檢測結果的分類。
System.out.println(((JSONObject) result).getString("label"));
// 置信度分數,取值范圍:0(表示置信度最低)~100(表示置信度最高)。
System.out.println(((JSONObject) result).getString("rate"));
// 視頻檢測場景,與調用請求中的檢測場景一致。
System.out.println(((JSONObject) result).getString("scene"));
// 建議您執行的后續操作。取值:
// pass:結果正常,無需進行其他操作。
// review:結果不確定,需要人工審核。
// block:結果違規,建議直接刪除或者限制公開。
System.out.println(((JSONObject) result).getString("suggestion"));
}
} else {
// 單個視頻處理失敗,原因視具體的情況詳細分析。
System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult));
}
}
} else {
/**
* 表明請求整體處理失敗,原因視具體的情況詳細分析。
*/
System.out.println("the whole scan request failed. response:" + JSON.toJSONString(scrResponse));
}
} else {
System.out.println("response not success. status:" + httpResponse.getStatus());
}
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}
提交視頻同步檢測任務
接口 | 描述 | 支持的地域 |
VideoSyncScanRequest | 提交視頻同步檢測任務,同步檢測視頻中的風險內容。 說明 同步檢測只支持傳遞視頻幀序列,不支持檢測視頻文件,推薦使用異步檢測接口。 |
|
示例代碼
以下代碼中使用幀序列的方式提交待檢測的視頻。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.green.model.v20180509.VideoSyncScanRequest;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.HttpResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public class Main {
public static void main(String[] args) throws Exception {
/**
* 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。
* 常見獲取環境變量方式:
* 方式一:
* 獲取RAM用戶AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 獲取RAM用戶AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
* 方式二:
* 獲取RAM用戶AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 獲取RAM用戶AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
*/
DefaultProfile profile = DefaultProfile.getProfile(
"cn-shanghai",
"建議從環境變量中獲取RAM用戶AccessKey ID",
"建議從環境變量中獲取RAM用戶AccessKey Secret");
DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com");
// 注意:此處實例化的client盡可能重復使用,提升檢測性能。避免重復建立連接。
IAcsClient client = new DefaultAcsClient(profile);
VideoSyncScanRequest videoSyncScanRequest = new VideoSyncScanRequest();
videoSyncScanRequest.setAcceptFormat(FormatType.JSON); // 指定API返回格式。
videoSyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定請求方法。
List<Map<String, Object>> tasks = new ArrayList<Map<String, Object>>();
Map<String, Object> task = new LinkedHashMap<String, Object>();
task.put("dataId", UUID.randomUUID().toString());
List<Map<String, Object>> frames = new ArrayList<Map<String, Object>>();
Map<String, Object> frame1 = new LinkedHashMap<String, Object>();
frame1.put("offset", 0);
frame1.put("url", "視頻截幀地址1");
Map<String, Object> frame2 = new LinkedHashMap<String, Object>();
frame2.put("offset", 5);
frame2.put("url", "視頻截幀地址2");
Map<String, Object> frame3 = new LinkedHashMap<String, Object>();
frame3.put("offset", 10);
frame3.put("url", "視頻截幀地址3");
frames.addAll(Arrays.asList(frame1, frame2, frame3));
task.put("frames", frames);
tasks.add(task);
/**
* 設置要檢測的場景。計費依據此處傳遞的場景計算。
* 視頻默認1秒截取一幀,您可以自行控制截幀頻率,收費按照視頻的截幀數量以及每一幀的檢測場景進行計算。
* 舉例:1分鐘的視頻截幀60張,檢測色情(對應場景參數porn)和暴恐涉政(對應場景參數terrorism)2個場景,收費按照60張色情+60張暴恐涉政進行計算。
*/
JSONObject data = new JSONObject();
data.put("scenes", Arrays.asList("porn", "terrorism"));
data.put("tasks", tasks);
videoSyncScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON);
/**
* 請務必設置超時時間。
*/
videoSyncScanRequest.setConnectTimeout(3000);
videoSyncScanRequest.setReadTimeout(10000);
try {
HttpResponse httpResponse = client.doAction(videoSyncScanRequest);
if (httpResponse.isSuccess()) {
JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
System.out.println(JSON.toJSONString(scrResponse, true));
int requestCode = scrResponse.getIntValue("code");
// 每一個視頻的檢測結果。
JSONArray taskResults = scrResponse.getJSONArray("data");
if (200 == requestCode) {
for (Object taskResult : taskResults) {
// 單個視頻的處理結果。
int taskCode = ((JSONObject) taskResult).getIntValue("code");
if (200 == taskCode) {
// taskId。
System.out.println(((JSONObject) taskResult).getString("taskId"));
// 檢測結果。
JSONArray results = scrResponse.getJSONArray("results");
for (Object result : results) {
// 視頻檢測結果的分類。
System.out.println(((JSONObject) result).getString("label"));
// 置信度分數,取值范圍:0(表示置信度最低)~100(表示置信度最高)。
System.out.println(((JSONObject) result).getString("rate"));
// 視頻檢測場景,和調用請求中的場景對應。
System.out.println(((JSONObject) result).getString("scene"));
// 建議您執行的后續操作。取值:
// pass:結果正常,無需進行其余操作。
// review:結果不確定,需要進行人工審核。
// block:結果違規,建議直接刪除或者限制公開。
System.out.println(((JSONObject) result).getString("suggestion"));
}
} else {
// 單個視頻處理失敗,原因視具體的情況詳細分析。
System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult));
}
}
} else {
/**
* 表明請求整體處理失敗,原因視具體的情況詳細分析。
*/
System.out.println("the whole scan request failed. response:" + JSON.toJSONString(scrResponse));
}
} else {
System.out.println("response not success. status:" + httpResponse.getStatus());
}
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}
視頻檢測結果反饋
如果您認為視頻檢測結果與您的預期不符,可以通過視頻檢測結果反饋接口,對檢測結果進行糾正(系統會根據您反饋的結果,將視頻截幀添加到相似圖片的黑名單庫或者白名單庫)。當您再次提交相似的內容進行檢測時,以您反饋的label返回結果。
關于接口的說明,請參見檢測結果反饋。
接口 | 描述 | 支持的Region |
VideoFeedbackRequest | 提交視頻檢測結果的反饋,以人工反饋的檢測結果糾正算法檢測結果。 |
|
示例代碼
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.green.model.v20180509.VideoFeedbackRequest;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.HttpResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class VideoFeedbackSample {
public static void main(String[] args) throws Exception {
/**
* 阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。
* 常見獲取環境變量方式:
* 方式一:
* 獲取RAM用戶AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 獲取RAM用戶AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
* 方式二:
* 獲取RAM用戶AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 獲取RAM用戶AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
*/
DefaultProfile profile = DefaultProfile.getProfile(
"cn-shanghai",
"建議從環境變量中獲取RAM用戶AccessKey ID",
"建議從環境變量中獲取RAM用戶AccessKey Secret");
DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com");
// 注意:此處實例化的client盡可能重復使用,提升檢測性能。避免重復建立連接。
IAcsClient client = new DefaultAcsClient(profile);
VideoFeedbackRequest videoFeedbackRequest = new VideoFeedbackRequest();
// 指定API返回格式。
videoFeedbackRequest.setAcceptFormat(FormatType.JSON);
// 指定請求方法。
videoFeedbackRequest.setMethod(MethodType.POST);
videoFeedbackRequest.setEncoding("utf-8");
// 支持HTTP和HTTPS。
videoFeedbackRequest.setProtocol(ProtocolType.HTTP);
List<JSONObject> framesList = new ArrayList();
JSONObject frame1 = new JSONObject();
frame1.put("url", "視頻截幀鏈接_1");
frame1.put("offset", 100);
framesList.add(frame1);
// scenes:檢測場景,支持指定多個場景。
// suggestion:期望的檢測結果,pass:正常;block:違規。
JSONObject httpBody = new JSONObject();
httpBody.put("dataId", "檢測數據ID");
httpBody.put("taskId", "視頻審核任務ID");
httpBody.put("url", "視頻鏈接");
httpBody.put("suggestion", "block");
httpBody.put("frames", framesList);
httpBody.put("scenes", Arrays.asList("ad", "terrorism"));
httpBody.put("note", "備注信息");
videoFeedbackRequest.setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()),
"UTF-8", FormatType.JSON);
videoFeedbackRequest.setConnectTimeout(3000);
videoFeedbackRequest.setReadTimeout(10000);
try {
HttpResponse httpResponse = client.doAction(videoFeedbackRequest);
if (httpResponse.isSuccess()) {
JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
System.out.println(JSON.toJSONString(scrResponse, true));
int requestCode = scrResponse.getIntValue("code");
if (200 == requestCode) {
// 調用成功
} else {
/**
* 表明請求整體處理失敗,原因視具體的情況詳細分析。
*/
System.out.println("the whole request failed. response:" + JSON.toJSONString(scrResponse));
}
} else {
System.out.println("response not success. status:" + httpResponse.getStatus());
}
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}