| | |
| | | import com.ard.sample.manage.service.ILiveStreamService; |
| | | import com.ard.vtdu.config.MediamtxConfig; |
| | | import com.ard.vtdu.domain.ArdVtdu; |
| | | import com.ard.vtdu.service.IMediaMTXService; |
| | | import com.ard.vtdu.service.IArdMediaService; |
| | | import com.ard.vtdu.service.IArdVtduService; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.lang.reflect.Field; |
| | | import java.util.*; |
| | |
| | | private IMessageSenderService messageSender; |
| | | |
| | | @Resource |
| | | private IMediaMTXService mediaService; |
| | | private IArdVtduService ardVtduService; |
| | | @Resource |
| | | private MediamtxConfig mediamtxConfig; |
| | | |
| | |
| | | @Override |
| | | public void saveLiveCapacity(LiveCapacityReceiver liveCapacityReceiver, Long timestamp) { |
| | | // Solve timing problems |
| | | if (liveCapacityReceiver == null) { |
| | | //2025-10-28 zwy,这里有个空指针异常问题,如果liveCapacityReceiver为空,则不应该执行下面的代码。 |
| | | //机场设备在刚开机时,发送的state状态时,直播能力前三次发送的是空,可能是由于刚开机,等待各设备开机,第四次为正常数据。 |
| | | return; |
| | | } |
| | | for (CapacityDeviceReceiver capacityDeviceReceiver : liveCapacityReceiver.getDeviceList()) { |
| | | long last = (long) Objects.requireNonNullElse( |
| | | RedisOpsUtils.get(RedisConst.LIVE_CAPACITY + capacityDeviceReceiver.getSn()), 0L); |
| | |
| | | |
| | | @Override |
| | | public ResponseResult liveStart(LiveTypeDTO liveParam) { |
| | | String rtmpPublishUrl="rtmp://" + mediamtxConfig.getApiHost() + ":1935/" + liveParam.getVideoId(); |
| | | String rtmpPublishUrl = |
| | | "rtmp://" + mediamtxConfig.getApiHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + liveParam.getVideoId(); |
| | | liveParam.setUrl(rtmpPublishUrl); |
| | | // Check if this lens is available live. |
| | | ResponseResult responseResult = this.checkBeforeLive(liveParam.getVideoId()); |
| | |
| | | |
| | | switch (urlType) { |
| | | case RTMP: |
| | | ArdVtdu vtdu = new ArdVtdu(); |
| | | vtdu.setName(liveParam.getVideoId()); |
| | | vtdu = mediaService.addPath(vtdu); |
| | | live.setRtmpUrl(vtdu.getRtmpUrl()); |
| | | live.setRtspUrl(vtdu.getRtspUrl()); |
| | | live.setWebrtcUrl(vtdu.getWebrtcUrl()); |
| | | String name = liveParam.getVideoId(); |
| | | // 拼接地址 |
| | | String rtspUrl = |
| | | "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + name; // |
| | | // 拼接 webrtcUrl |
| | | String rtmpUrl = |
| | | "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + name; // |
| | | // 拼接 webrtcUrl |
| | | String protocol = mediamtxConfig.isHttps() ? "https://" : "http://"; |
| | | String webrtcUrl = |
| | | protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + name; // 拼接 |
| | | // webrtcUrl |
| | | |
| | | // 如果没有,插入新的记录 |
| | | ArdVtdu vtdu = |
| | | ArdVtdu.builder().name(name).rtspSource("publisher").rtspUrl(rtspUrl).rtmpUrl(rtmpUrl).webrtcUrl(webrtcUrl).build(); |
| | | int i = ardVtduService.insertArdVtdu(vtdu); // 保存到媒体表 |
| | | if (i > 0) { |
| | | live.setRtmpUrl(rtmpUrl); |
| | | live.setRtspUrl(rtspUrl); |
| | | live.setWebrtcUrl(webrtcUrl); |
| | | } |
| | | |
| | | break; |
| | | case RTSP: |
| | | Object url = Objects.requireNonNullElse(receiveReply.getOutput(), receiveReply.getInfo()); |
| | |
| | | if (receiveReply.getResult() != 0) { |
| | | return ResponseResult.error(LiveErrorEnum.find(receiveReply.getResult())); |
| | | } |
| | | mediaService.removePath(videoId); |
| | | ardVtduService.deleteArdVtduByName(videoId); |
| | | return ResponseResult.success(); |
| | | } |
| | | |