在做直播,社交类项目的时候,通常会用到一些im流监控的手段,来监控视频防止一些涉黄等不良东西出现,然后运营人员能直接监控,并且下线,警告等功能,比如直播的超管就能随时封禁直播间。今天我们就来对接声网的
接口,来实现监控的功能。
上面就是大概的业务逻辑,接下来就是看看声网的接口了。
接口文档 : 云端录制文档
根据自己的业务来选择调用那个接口,我这里就先用视频截图,的接口了。
https://docs.agora.io/cn/cloud-recording/cloud_recording_screen_capture?platform=RESTful
请大家一定要先看好文档的没一个细节,避免入坑。
第一个接口,获取resource Id ,调用这个接口,成功后,会获取 resource Id ,然后再视频截图的接口中会需要用到。
这里是需要生成加密的一个认证,在其他的接口中,都会用到,所以我们弄成共用的方法来使用。
public String getKey(){ // 拼接客户 ID 和客户密钥并使用 base64 编码 String plainCredentials = agoraToConfig.getAppKey() + ":" + agoraToConfig.getAppSecret(); String base64Credentials = new String(Base64.getEncoder().encode(plainCredentials.getBytes())); // 创建 authorization header String authorizationHeader = "Basic " + base64Credentials; return authorizationHeader; }
public String getAcquire(String cname,String uid) { JSONObject jsonObject = JSONUtil.createObj(); JSONObject object = JSONUtil.createObj(); object.set("resourceExpiredHour",24); object.set("scene",0); jsonObject.set("cname",cname); jsonObject.set("uid",uid); jsonObject.set("clientRequest",object); String authorization = HttpRequest.post(ACQUIRE.replaceAll("<yourappid>",agoraToConfig.getAppId())) .header("Authorization", this.getKey()) .header("Content-Type", "application/json;charset=utf-8") .body(jsonObject.toString()).execute().body(); JSONObject jsonObject1 = JSONUtil.parseObj(authorization); String resourceId = jsonObject1.getStr("resourceId"); System.out.println(resourceId); return resourceId; }
代码中使用了hutool 工具类,大家都加入一下依赖。
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.6.5</version> </dependency>
这里有一个小的细节,请大家注意,在官方给的文档参数中,这个参数是要在URL中替换的
https://api.agora.io/v1/apps/<yourappid>/cloud_recording/acquire
yourappid 替换成你的appid 这里注意了,不是请求参数,而是直接url上面替换参数。
https://docs.agora.io/cn/cloud-recording/cloud_recording_api_rest?platform=RESTful#start
详细文档,请大家一定要注意观看,并且cname和uid都是保持一致的,不然就不能成功。
public String modeStart() throws Exception{ String cname = RandomUtil.randomNumbers(6); String uid = RandomUtil.randomString("123456789",4); JSONObject jsonObject = JSONUtil.createObj(); JSONObject clientRequest = JSONUtil.createObj(); clientRequest.set("clientRequest",jsonObject); clientRequest.set("cname",cname); clientRequest.set("uid",uid); jsonObject.set("token",this.getChannelKey(cname,Long.valueOf(uid)).getData()); JSONObject recordingConfig = JSONUtil.createObj(); recordingConfig.set("channelType",0); recordingConfig.set("subscribeUidGroup",3); jsonObject.set("recordingConfig",recordingConfig); JSONObject snapshotConfig = JSONUtil.createObj(); snapshotConfig.set("captureInterval",5); JSONArray array = JSONUtil.createArray(); array.add("jpg"); snapshotConfig.set("fileType",array.toArray()); jsonObject.set("snapshotConfig",snapshotConfig); JSONObject storageConfig = JSONUtil.createObj(); storageConfig.set("vendor",0); storageConfig.set("region",2); storageConfig.set("bucket",agoraToConfig.getBucket()); storageConfig.set("accessKey",agoraToConfig.getAccessKey()); storageConfig.set("secretKey",agoraToConfig.getSecretKey()); JSONArray fileNamePrefix = JSONUtil.createArray(); fileNamePrefix.add("monitor"); storageConfig.set("fileNamePrefix",fileNamePrefix.toArray()); jsonObject.set("storageConfig",storageConfig); String url = MODESTART.replaceAll("<yourappid>", agoraToConfig.getAppId()).replaceAll("<resourceid>", this.getAcquire(cname, uid)); String authorization = HttpRequest.post(url) .header("Authorization", this.getKey()) .header("Content-Type", "application/json;charset=utf-8") .body(clientRequest.toString()).execute().body(); JSONObject object = JSONUtil.createObj(); JSONObject parseObj = JSONUtil.parseObj(authorization); object.set("resourceId",parseObj.getStr("resourceId")); object.set("sid",parseObj.getStr("sid")); object.set("uid",uid); object.set("cname",cname); return object.toString(); }
获取成功后,记得保持信息,在后续的stop 中会需要这几个信息。,resourceId ,sid ,uid,cname都需要
不保持,在后续的停止录制中,无法停止。调用视频截图后,当前接口就会一直监控着直播,然后每5秒截图上次到七牛云上面。
看着官方文档的参数就知道了,在前面接口中的参数都需要保持起来,这里我就保持到redis中就行了。
/** * 结束录制: * @return * @throws Exception */ public String modeStop(String authorization) throws Exception { JSONObject parseObj = JSONUtil.parseObj(authorization); JSONObject jsonObject = JSONUtil.createObj(); JSONObject clientRequest = JSONUtil.createObj(); jsonObject.set("cname",parseObj.getStr("cname")); jsonObject.set("uid",parseObj.getStr("uid")); jsonObject.set("clientRequest",clientRequest); System.out.println(authorization); String url = MODESTOP.replaceAll("<yourappid>", agoraToConfig.getAppId()).replaceAll("<resourceid>", parseObj.getStr("resourceId")) .replaceAll("<sid>",parseObj.getStr("sid")); String body = HttpRequest.post(url) .header("Authorization", this.getKey()) .header("Content-Type", "application/json;charset=utf-8") .body(jsonObject.toString()).execute().body(); System.out.println(body); return body; }
目前为止,简单的视频直播监控就基本结束了,请大家注意,由于工作原因,我不可能把所有的代码都弄出来,这里的代码基本都实现了功能,还有一些业务方面的东西需要自己去弄,比如 key等东西。
实例代码在github上面需要的请自行拉取:spring-boot-integrate 然后后续会集成更多的模块进去,需要请点个star。后续会集成更多的接口实现,有需要的请保存。
如果这篇文章,有帮助到大家的,请给作者一个一键三连,谢谢