You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

92 lines
3.0 KiB

package com.inspect.tcpserver.sip.media;
import java.util.StringTokenizer;
public class SdpParser {
public static SdpInfo parse(String sdp) {
SdpInfo info = new SdpInfo();
String[] lines = sdp.split("\\r?\\n");
for (String line : lines) {
line = line.trim();
if (line.isEmpty()) continue;
// ---------- 会话级 ----------
if (line.startsWith("c=")) {
// c=IN IP4 192.168.1.116
String[] parts = line.split("\\s+");
if (parts.length >= 3) {
info.setRemoteIp(parts[2]);
}
}
// ---------- media ----------
else if (line.startsWith("m=video")) {
// m=video 50000 TCP/AVP 98
StringTokenizer st = new StringTokenizer(line);
st.nextToken(); // m=video
info.setMediaPort(Integer.parseInt(st.nextToken()));
String proto = st.nextToken();
if (proto.toUpperCase().contains("TCP")) {
info.setTransport(SdpInfo.Transport.RTP_TCP);
} else {
info.setTransport(SdpInfo.Transport.RTP_UDP);
}
info.setPayloadType(Integer.parseInt(st.nextToken()));
}
// ---------- rtpmap ----------
else if (line.startsWith("a=rtpmap")) {
// a=rtpmap:98 H264/90000
String value = line.substring("a=rtpmap:".length());
String[] parts = value.split("\\s+");
if (parts.length == 2) {
String[] codecInfo = parts[1].split("/");
info.setCodec(codecInfo[0]);
info.setClockRate(Integer.parseInt(codecInfo[1]));
}
}
// ---------- setup ----------
else if (line.startsWith("a=setup:")) {
info.setSetup(line.substring("a=setup:".length()));
}
// ---------- connection ----------
else if (line.startsWith("a=connection:")) {
info.setConnection(line.substring("a=connection:".length()));
}
// ---------- fmtp ----------
else if (line.startsWith("a=fmtp:")) {
// 可留作扩展
info.putAttribute("fmtp", line);
}
// ---------- y= (SSRC) ----------
else if (line.startsWith("y=")) {
// y=0700000038
info.setSsrc(Long.parseLong(line.substring(2)));
}
// ---------- 其他属性 ----------
else if (line.startsWith("a=")) {
int idx = line.indexOf(':');
if (idx > 0) {
info.putAttribute(
line.substring(2, idx),
line.substring(idx + 1)
);
}
}
}
return info;
}
}