panlinlin
2021-03-01 421c2f56020bfe60b0e0c90e9d509abf03354dab
使用jainsip的方式解析sdp
3个文件已修改
6个文件已删除
779 ■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/Codec.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/MediaDescription.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/RFC4566_28181.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/SdpLine.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/SdpParser.java 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/SessionDescription.java 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java 107 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/.postcssrc.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/Codec.java
File was deleted
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/MediaDescription.java
File was deleted
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/RFC4566_28181.java
File was deleted
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/SdpLine.java
File was deleted
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/SdpParser.java
File was deleted
src/main/java/com/genersoft/iot/vmp/gb28181/sdp/SessionDescription.java
File was deleted
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -375,7 +375,6 @@
                        content.append("a=setup:passive\r\n");
                        content.append("a=connection:new\r\n");
                    } else if ("TCP-ACTIVE".equals(streamMode)) { // tcp主动模式
                    } else if ("TCP-ACTIVE".equals(streamMode)) { // tcp主动模式
                        content.append("a=setup:active\r\n");
                        content.append("a=connection:new\r\n");
                    }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/InviteRequestProcessor.java
@@ -113,45 +113,84 @@
            }
            // 解析sdp消息, 使用jainsip 自带的sdp解析方式
            String contentString = new String(request.getRawContent());
            SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(contentString);
            // TODO 区分TCP发流还是udp, 当前默认udp
            // jainSip不支持y=字段, 移除移除以解析。
            int ssrcIndex = contentString.indexOf("y=");
            String ssrc = contentString.substring(ssrcIndex + 2, contentString.length())
                    .replace("\r\n", "").replace("\n", "");
            String substring = contentString.substring(0, contentString.indexOf("y="));
            SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(substring);
            //  获取支持的格式
            Vector mediaDescriptions = sdp.getMediaDescriptions(true);
            // 查看是否支持PS 负载96
            String ip = null;
            int port = -1;
            boolean recvonly = false;
            boolean mediaTransmissionTCP = false;
            Boolean tcpActive = null;
            for (int i = 0; i < mediaDescriptions.size(); i++) {
                MediaDescription mediaDescription = (MediaDescription)mediaDescriptions.get(i);
                Media media = mediaDescription.getMedia();
                port = media.getMediaPort();
            }
//            for (MediaDescription mediaDescription : mediaDescriptions) {
                Vector mediaFormats = media.getMediaFormats(false);
                if (mediaFormats.contains("96")) {
                    port = media.getMediaPort();
                    String mediaType = media.getMediaType();
                    String protocol = media.getProtocol();
                    // 区分TCP发流还是udp, 当前默认udp
                    if ("TCP/RTP/AVP".equals(protocol)) {
                        String setup = mediaDescription.getAttribute("setup");
                        if (setup != null) {
                            mediaTransmissionTCP = true;
                            if ("active".equals(setup)) {
                                tcpActive = true;
                            }else if ("passive".equals(setup)) {
                                tcpActive = false;
                            }
                        }
                    }
//                    Vector attributes = mediaDescription.getAttributes(false);
//                    for (Object attributeObj : attributes) {
//                        Attribute attribute = (Attribute)attributeObj;
//                        String name = attribute.getName();
//                        switch (name){
//                            case "recvonly":
//                                recvonly = true;
//                                break;
//                            case "rtpmap":
//                            case "connection":
//                                break;
//                            case "setup":
//                                mediaTransmissionTCP = true;
//                                if ("active".equals(attribute.getValue())) {  // tcp主动模式
//                                    tcpActive = true;
//                                }else if ("passive".equals(attribute.getValue())){ // tcp被动模式
//                                    tcpActive = false;
//                                }
//                                break;
//
//                List<Codec> codecs = mediaDescription.getCodecs();
//                for (Codec codec : codecs) {
//                    if("96".equals(codec.getPayloadType()) || "PS".equals(codec.getName()) || "ps".equals(codec.getName())) {
//                        // TODO 这里很慢
//                        ip = mediaDescription.getIpAddress().getHostName();
//                        port = mediaDescription.getPort();
//                        break;
//                        }
//                        if ("recvonly".equals(name)) {
//                            recvonly = true;
//                        }
//
//                        String value = attribute.getValue();
//                    }
//                }
//            }
//            if (ip == null || port == -1) { // TODO 没有合适的视频流格式, 可配置是否使用第一个media信息
//                if (mediaDescriptions.size() > 0) {
//                    ip = mediaDescriptions.get(0).getIpAddress().getHostName();
//                    port = mediaDescriptions.get(0).getPort();
//                }
//            }
//
//            if (ip == null || port == -1) {
//                response488Ack(evt);
//                return;
//            }
//
//
//            String ssrc = sdp.getSsrc();
                    break;
                }
            }
            if (port == -1) {
                // 回复不支持的格式
                response415Ack(evt); // 不支持的格式,发415
                return;
            }
            String username = sdp.getOrigin().getUsername();
            String addressStr = sdp.getOrigin().getAddress();
            String sessionName = sdp.getSessionName().getValue();
            logger.info("[上级点播]用户:{}, 地址:{}:{}, ssrc:{}", username, addressStr, port, ssrc);
//
//            Device device = storager.queryVideoDeviceByPlatformIdAndChannelId(platformId, channelId);
//            if (device == null) {
@@ -278,6 +317,18 @@
    }
    /***
     * 回复415 不支持的媒体类型
     * @param evt
     * @throws SipException
     * @throws InvalidArgumentException
     * @throws ParseException
     */
    private void response415Ack(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
        Response response = getMessageFactory().createResponse(Response.UNSUPPORTED_MEDIA_TYPE, evt.getRequest());
        getServerTransaction(evt).sendResponse(response);
    }
    /***
     * 回复488
     * @param evt
     * @throws SipException
web_src/.postcssrc.js
@@ -7,7 +7,7 @@
    // to edit target browsers: use "browserslist" field in package.json
    "autoprefixer": {},
    'postcss-pxtorem': {
      rootValue: 24,
      rootValue: 16,
      propList: ['font-size'] // 只转化font-size
    }
  }