Eric 2 gadi atpakaļ
vecāks
revīzija
f0c134fbd2

+ 126 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TencentData.java

@@ -7,6 +7,7 @@ import com.alibaba.fastjson.annotation.JSONField;
 import com.ym.mec.biz.dal.enums.ETencentGroupType;
 import com.ym.mec.biz.dal.enums.ETencentImCallbackCommand;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -23,8 +24,6 @@ import java.util.List;
  * @author liujunchi
  * @date 2023-03-06
  */
-@NoArgsConstructor
-@Data
 public class TencentData {
 
     // 群成员离开之后回调对象
@@ -196,42 +195,86 @@ public class TencentData {
     @ApiModel("推断流事件回调通知")
     public static class CallbackStreamStateEvent implements Serializable {
 
+
+        @ApiModelProperty("推流域名")
         @JSONField(name = "app")
         private String app;
+
+        @ApiModelProperty("用户 APPID")
         @JSONField(name = "appid")
         private Integer appid;
+
+        @ApiModelProperty("推流路径")
         @JSONField(name = "appname")
         private String appname;
+
+        @ApiModelProperty("同直播流名称")
         @JSONField(name = "channel_id")
         private String channelId;
+
+        @ApiModelProperty("断流事件通知推流时长,单位毫秒")
+        @JSONField(name = "push_duration")
+        private String pushDuration;
+
+        @ApiModelProperty("推断流错误码")
         @JSONField(name = "errcode")
         private Integer errcode;
+
+        @ApiModelProperty("推断流错误描述")
         @JSONField(name = "errmsg")
         private String errmsg;
+
+        @ApiModelProperty("事件消息产生的 UNIX 时间戳")
         @JSONField(name = "event_time")
         private Integer eventTime;
+
+        @ApiModelProperty("事件类型: 推流:1;断流:0")
         @JSONField(name = "event_type")
         private Integer eventType;
+
+        @ApiModelProperty("判断是否为国内外推流。1-6为国内,7-200为国外")
         @JSONField(name = "set_id")
         private Integer setId;
+
+        @ApiModelProperty("直播接入点的 IP")
         @JSONField(name = "node")
         private String node;
+
+        @ApiModelProperty("消息序列号,标识一次推流活动,一次推流活动会产生相同序列号的推流和断流消息")
         @JSONField(name = "sequence")
         private String sequence;
+
+        @ApiModelProperty("直播流名称")
         @JSONField(name = "stream_id")
         private String streamId;
+
+        @ApiModelProperty("用户推流 URL 所带参数")
         @JSONField(name = "stream_param")
         private String streamParam;
+
+        @ApiModelProperty("用户推流 IP")
         @JSONField(name = "user_ip")
         private String userIp;
+
+        @ApiModelProperty("视频宽度,最开始推流回调的时候若视频头部信息缺失,可能为0")
         @JSONField(name = "width")
         private Integer width;
+
+        @ApiModelProperty("视频高度,最开始推流回调的时候若视频头部信息缺失,可能为0")
         @JSONField(name = "height")
         private Integer height;
+
+        @ApiModelProperty("事件通知安全签名 sign = MD5(key + t)")
         @JSONField(name = "sign")
         private String sign;
+
+        @ApiModelProperty("过期时间,事件通知签名过期 UNIX 时间戳")
         @JSONField(name = "t")
         private Integer t;
+
+        public static CallbackStreamStateEvent from(String jsonString) {
+            return JSON.parseObject(jsonString, CallbackStreamStateEvent.class);
+        }
     }
 
     @Data
@@ -241,53 +284,102 @@ public class TencentData {
     @ApiModel("流录制事件回调通知")
     public static class CallbackSteamRecordEvent implements Serializable {
 
+        @ApiModelProperty("事件类型:直播录制: 100")
         @JSONField(name = "event_type")
         private Integer eventType;
+
+        @ApiModelProperty("用户 APPID")
         @JSONField(name = "appid")
         private Integer appid;
+
+        @ApiModelProperty("推流域名")
         @JSONField(name = "app")
         private String app;
+
+        @ApiModelProperty("json对象字符串,用户自定义数据")
         @JSONField(name = "callback_ext")
         private String callbackExt;
+
+        @ApiModelProperty("推流路径")
         @JSONField(name = "appname")
         private String appname;
+
+        @ApiModelProperty("直播流名称")
         @JSONField(name = "stream_id")
         private String streamId;
+
+        @ApiModelProperty("同直播流名称")
         @JSONField(name = "channel_id")
         private String channelId;
+
+        @ApiModelProperty("点播 file ID,在 云点播平台 可以唯一定位一个点播视频文件")
         @JSONField(name = "file_id")
         private String fileId;
+
+        @ApiModelProperty("点播文件ID")
         @JSONField(name = "record_file_id")
         private String recordFileId;
+
+        @ApiModelProperty("文件格式: FLV,HLS,MP4,AAC")
         @JSONField(name = "file_format")
         private String fileFormat;
+
+        @ApiModelProperty("录制任务 ID")
         @JSONField(name = "task_id")
         private String taskId;
+
+        @ApiModelProperty("录制任务开始写文件的时间;不能以该值作为录制内容的开始时间,录制内容的开始时间 = end_time – duration")
         @JSONField(name = "start_time")
         private Integer startTime;
+
+        @ApiModelProperty("录制任务结束写文件的时间")
         @JSONField(name = "end_time")
         private Integer endTime;
+
+        @ApiModelProperty("录制任务开始写文件的时间,微秒部分")
         @JSONField(name = "start_time_usec")
         private Integer startTimeUsec;
+
+        @ApiModelProperty("录制任务结束写文件的时间,微秒部分")
         @JSONField(name = "end_time_usec")
         private Integer endTimeUsec;
+
+        @ApiModelProperty("录制文件时长,单位秒")
         @JSONField(name = "duration")
         private Integer duration;
+
+        @ApiModelProperty("录制文件大小,单位字节")
         @JSONField(name = "file_size")
         private Integer fileSize;
+
+        @ApiModelProperty("用户推流 URL 所带参数(自定义)")
         @JSONField(name = "stream_param")
         private String streamParam;
+
+        @ApiModelProperty("录制文件下载 URL")
         @JSONField(name = "video_url")
         private String videoUrl;
+
+        @ApiModelProperty("录制开始拉流收到的首帧 pts ")
         @JSONField(name = "media_start_time")
         private Integer mediaStartTime;
+
+        @ApiModelProperty("录制从转码拉流录制对应的码率(单位 kbps)")
         @JSONField(name = "record_bps")
         private Integer recordBps;
+
+        @ApiModelProperty("事件通知安全签名 sign = MD5(key + t)")
         @JSONField(name = "sign")
         private String sign;
+
+        @ApiModelProperty("过期时间,事件通知签名过期 UNIX 时间戳")
         @JSONField(name = "t")
         private Integer t;
 
+
+        public static CallbackSteamRecordEvent from(String json) {
+            return JSON.parseObject(json, CallbackSteamRecordEvent.class);
+        }
     }
 
     @Data
@@ -296,32 +388,63 @@ public class TencentData {
     @ApiModel("流异常事件回调通知")
     public static class CallbackStreamExceptionEvent implements Serializable {
 
-
+        @ApiModelProperty("用户 APPID")
         @JSONField(name = "appid")
         private Integer appid;
+
+        @ApiModelProperty("推流事件回调时间(单位ms)")
         @JSONField(name = "data_time")
         private Long dataTime;
+
+        @ApiModelProperty("推流域名")
         @JSONField(name = "domain")
         private String domain;
+
+        @ApiModelProperty("事件类型:推流异常:321")
         @JSONField(name = "event_type")
         private Integer eventType;
+
         @JSONField(name = "interface")
         private String interfaceX;
         @JSONField(name = "path")
         private String path;
+
+        @ApiModelProperty("有异常事件时,上报间隔(单位ms)")
         @JSONField(name = "report_interval")
         private Integer reportInterval;
+
         @JSONField(name = "sequence")
         private String sequence;
+
+        @ApiModelProperty("直播流名称")
         @JSONField(name = "stream_id")
         private String streamId;
+
+        @ApiModelProperty("用户推流 URL 所带参数")
         @JSONField(name = "stream_param")
         private String streamParam;
+
         @JSONField(name = "timeout")
         private Integer timeout;
+
+        @ApiModelProperty("详细异常事件事件组")
         @JSONField(name = "abnormal_event")
         private String abnormalEvent;
+
+        public static CallbackStreamExceptionEvent from(String json) {
+            return JSON.parseObject(json, CallbackStreamExceptionEvent.class);
+        }
     }
 
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("流事件回调结果")
+    public static class StreamEventCallbackResult implements Serializable {
+
+        @ApiModelProperty("事件响应状态")
+        private Integer code;
+    }
 
 }

+ 1 - 0
mec-im/src/main/java/com/ym/config/ResourceServerConfig.java

@@ -16,6 +16,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                         "/group/dismiss", "/room/statusImMsg", "/history/get", "/user/statusImUser", "/liveRoom/recordSync",
                         "/liveRoom/publishRoomMsg", "/liveRoom/destroy", "/liveRoom/create", "/liveRoom/startRecord",
                         "/liveRoom/stopRecord", "/liveRoom/userExistInRoom","/liveRoom/checkOnline",
+                        "/user/tencentStreamEventCallback", "/user/tencentStreamRecordCallback", "/user/tencentStreamExceptionCallback",
                         "/liveRoom/addUserUnableSpeak","/liveRoom/removeUserUnableSpeak","/liveRoom/syncChatRoomStatus","/liveRoom/tencentImCallback")
                 .permitAll().anyRequest().authenticated().and().csrf().disable();
     }

+ 43 - 0
mec-im/src/main/java/com/ym/controller/UserController.java

@@ -93,4 +93,47 @@ public class UserController {
 
         return new TencentImCallbackResult();
     }
+
+
+    @ApiOperation("腾讯云直播-推流 回调接口")
+    @PostMapping(value = "/tencentStreamEventCallback")
+    public TencentData.StreamEventCallbackResult tencentStreamEventCallback(@RequestBody String body) {
+
+        log.info("tencentStreamEventCallback body:{}", body);
+
+        TencentData.CallbackStreamStateEvent event = TencentData.CallbackStreamStateEvent.from(body);
+
+        if (event.getEventType() == 0) {
+            // 断流事件通知
+        }
+
+        if (event.getEventType() == 1) {
+            // 推流事件通知
+        }
+
+        return TencentData.StreamEventCallbackResult.builder().code(0).build();
+    }
+
+    @ApiOperation("腾讯云直播-录制 回调接口")
+    @PostMapping(value = "/tencentStreamRecordCallback")
+    public TencentData.StreamEventCallbackResult tencentStreamRecordCallback(@RequestBody String body) {
+
+        log.info("tencentStreamRecordCallback body:{}", body);
+
+        TencentData.CallbackSteamRecordEvent event = TencentData.CallbackSteamRecordEvent.from(body);
+
+        log.info("taskId={}, url={}", event.getTaskId(), event.getVideoUrl());
+
+        return TencentData.StreamEventCallbackResult.builder().code(0).build();
+    }
+
+    @ApiOperation("腾讯云直播-推流异常 回调接口")
+    @PostMapping(value = "/tencentStreamExceptionCallback")
+    public TencentData.StreamEventCallbackResult tencentStreamExceptionCallback(@RequestBody String body) {
+
+        log.info("tencentStreamExceptionCallback body:{}", body);
+
+        return TencentData.StreamEventCallbackResult.builder().code(0).build();
+    }
+
 }