diff --git a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/gb28181/sdp/FormatField.java b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/gb28181/sdp/FormatField.java new file mode 100644 index 0000000..b735c45 --- /dev/null +++ b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/gb28181/sdp/FormatField.java @@ -0,0 +1,74 @@ +package cn.skcks.docking.gb28181.mocking.core.sip.gb28181.sdp; + +import com.fasterxml.jackson.databind.json.JsonMapper; +import gov.nist.core.Separators; +import gov.nist.javax.sdp.fields.SDPField; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +@Slf4j +@EqualsAndHashCode(callSuper = true) +@Data +@AllArgsConstructor +public class FormatField extends SDPField { + public static final String FORMAT_FIELD_NAME = "f"; + private static final String FORMAT_FIELD = FORMAT_FIELD_NAME + "="; + public FormatField() { + super(FORMAT_FIELD); + } + + /** + * 视频编码格式 + */ + private String videoFormat = ""; + /** + * 视频分辨率 + */ + private String videoRatio = ""; + /** + * 视频帧率 + */ + private String videoFrame = ""; + /** + * 视频码率类型 + */ + private String videoRateType = ""; + /** + * 视频码率大小 + */ + private String videoRateNum = ""; + /** + * 音频编码格式 + */ + private String audioFormat = ""; + /** + * 音频码率大小 + */ + private String audioRateNum = ""; + /** + * 音频采样率 + */ + private String audioSampling = ""; + + @SneakyThrows + @Override + public String encode() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(FORMAT_FIELD); + if(!StringUtils.isAllBlank(videoFormat, videoRatio, videoFrame, videoRateType, videoRateNum,audioFormat, audioRateNum, audioSampling)){ + String video = StringUtils.joinWith("/", "v", videoFormat, videoRatio, videoFrame, videoRateType, videoRateNum); + String audio = StringUtils.joinWith("/", "a", audioFormat, audioRateNum, audioSampling); + stringBuilder.append(StringUtils.joinWith("/",video,audio)); + } + stringBuilder.append(Separators.NEWLINE); + return stringBuilder.toString(); + } + + public String toString(){ + return encode(); + } +} diff --git a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/gb28181/sdp/FormatFieldParser.java b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/gb28181/sdp/FormatFieldParser.java new file mode 100644 index 0000000..c538486 --- /dev/null +++ b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/gb28181/sdp/FormatFieldParser.java @@ -0,0 +1,75 @@ +package cn.skcks.docking.gb28181.mocking.core.sip.gb28181.sdp; + +import gov.nist.javax.sdp.fields.SDPField; +import gov.nist.javax.sdp.parser.Lexer; +import gov.nist.javax.sdp.parser.SDPParser; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.text.ParseException; + +@Slf4j +public class FormatFieldParser extends SDPParser { + public FormatFieldParser(String ssrcField) { + this.lexer = new Lexer("charLexer", ssrcField); + } + + public FormatField formatField() throws ParseException { + try { + this.lexer.match('f'); + this.lexer.SPorHT(); + this.lexer.match('='); + this.lexer.SPorHT(); + + FormatField formatField = new FormatField(); + String rest = lexer.getRest().trim(); + + String[] split = StringUtils.split(rest, 'a'); + if(split.length == 0){ + return formatField; + } + + log.info("{}", (Object) split); + String video = split[0]; + String[] videoParams = StringUtils.split(video,"/"); + log.info("{}", (Object) videoParams); + if(videoParams.length > 1){ + formatField.setVideoFormat(videoParams[1]); + } + if(videoParams.length > 2){ + formatField.setVideoRatio(videoParams[2]); + } + if(videoParams.length > 3){ + formatField.setVideoFrame(videoParams[3]); + } + if(videoParams.length > 4){ + formatField.setVideoRateType(videoParams[4]); + } + if(videoParams.length > 5){ + formatField.setVideoRateNum(videoParams[5]); + } + if(split.length < 2){ + return formatField; + } + String audio = split[1]; + String[] audioParams = audio.split("/"); + if(audioParams.length > 0){ + formatField.setAudioFormat(audioParams[0]); + } + if(audioParams.length > 1){ + formatField.setAudioRateNum(audioParams[1]); + } + if(audioParams.length > 2){ + formatField.setAudioSampling(audioParams[2]); + } + return formatField; + } catch (Exception e) { + e.printStackTrace(); + throw lexer.createParseException(); + } + } + + public SDPField parse() throws ParseException { + return this.formatField(); + } +} diff --git a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/gb28181/sdp/GB28181DescriptionParserFactory.java b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/gb28181/sdp/GB28181DescriptionParserFactory.java index 693d013..bb1cf9c 100644 --- a/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/gb28181/sdp/GB28181DescriptionParserFactory.java +++ b/gb28181-mocking-service/src/main/java/cn/skcks/docking/gb28181/mocking/core/sip/gb28181/sdp/GB28181DescriptionParserFactory.java @@ -12,6 +12,9 @@ public class GB28181DescriptionParserFactory { if(fieldName.equalsIgnoreCase("y")){ return new SsrcFieldParser(field); } + if(fieldName.equalsIgnoreCase("f")){ + return new FormatFieldParser(field); + } return ParserFactory.createParser(field); } }