java—用于sdp媒体行的正则表达式,以包含有效负载数组

0qx6xfy6  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(285)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

三天前关门了。
改进这个问题
我有一根绳子 m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 11 在sdp中用作媒体线。 m=audio 或者 m=video 只有两种可能的选择,而9和协议的数量以及存在的协议可以更改。
例如,它可能是 m=video 9 UDP/SAVPF 0 100 102 106 或者 m=audio 5004 RTP/AVP 0 . 如何根据有效负载得到一个正则表达式来匹配一个或多个数字的部分?我需要使用这个正则表达式提取整数数组。

  1. String str = "m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127";
  2. Pattern pattern = Pattern.compile(str);
  3. Matcher matcher = pattern.matcher("PATTERN");

以及 matcher.end 所以我可以得到数数组之前的空间索引,并且可以用 String.split(" ") 这样我就可以拥有 [96, 97, 98, 99, 100, 101, 127]

hmtdttj4

hmtdttj41#

(他删除了他的老问题:
我有一个sdp,可能包含媒体行,如 m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127 在用java编写的android应用程序中。

  1. v=0
  2. o=- 6009932412884070668 2 IN IP4 127.0.0.1
  3. s=-
  4. t=0 0
  5. a=group:BUNDLE 0 1
  6. a=msid-semantic: WMS SPDRASTRM
  7. m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126
  8. c=IN IP4 127.0.0.1
  9. a=rtcp:9 IN IP4 0.0.0.0
  10. a=ice-ufrag:fasdSOKDOASD
  11. a=ice-pwd:ExVayayP3ya/F5NSDASMAaslda
  12. a=ice-options:trickle renomination
  13. a=fingerprint:sha-256 3A:B8:7A:F5:D5:8F:01:5F
  14. a=setup:actpass
  15. a=mid:0
  16. a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
  17. a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
  18. a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
  19. a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
  20. a=extmap:5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
  21. a=extmap:6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
  22. a=sendrecv
  23. a=msid:SPDRASTRM SPDRSTRMa0
  24. a=rtcp-mux
  25. a=rtpmap:111 opus/48000/2
  26. a=rtcp-fb:111 transport-cc
  27. a=fmtp:111 minptime=10;useinbandfec=1
  28. a=rtpmap:103 ISAC/16000
  29. a=rtpmap:104 ISAC/32000
  30. a=rtpmap:9 G722/8000
  31. a=rtpmap:102 ILBC/8000
  32. a=rtpmap:0 PCMU/8000
  33. a=rtpmap:8 PCMA/8000
  34. a=rtpmap:106 CN/32000
  35. a=rtpmap:105 CN/16000
  36. a=rtpmap:13 CN/8000
  37. a=rtpmap:110 telephone-event/48000
  38. a=rtpmap:112 telephone-event/32000
  39. a=rtpmap:113 telephone-event/16000
  40. a=rtpmap:126 telephone-event/8000
  41. a=ssrc:2009365698 cname:mB+vyOSALUMJAUgW
  42. a=ssrc:2009365698 msid:SPDRASTRM SPDRSTRMa0
  43. a=ssrc:2009365698 mslabel:SPDRASTRM
  44. a=ssrc:2009365698 label:SPDRSTRMa0

使用sdp.split(“m=”)我可以拆分成一个字符串数组,其中包含以v=0开始的字符串,以及以视频和/或音频线开始的字符串,例如m=video 9 udp/tls/rtp/savpf 96 97 98 99 100 101 127,这是一个一般性问题,协议和有效负载计数或包含哪些有效负载都不是预定义的。
如何获取包含视频或音频线路中的编解码器有效负载的整数数组?我想找出一个正则表达式的解决方案。如何用正则表达式实现,或者javawebrtc方法中是否有任何方法将这些有效负载作为一个数组来获取?
)
我的回答是:

  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;
  3. import java.util.stream.*;
  4. public class MyClass {
  5. private static final Pattern p = Pattern.compile("(?:\\D+\\d*\\D+) ([ \\d]+)$");
  6. public static void main(String args[]) {
  7. String sdp = "a=msid-semantic: WMS SPDRASTRM\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126\nc=IN IP4 127.0.0.1";
  8. // String sdp = "m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126";
  9. for (String lala : sdp.split("\r?\n"))
  10. {
  11. int intArray[];
  12. Matcher m = p.matcher(lala);
  13. if (m.find())
  14. {
  15. // System.out.println(m.group(1));
  16. intArray = Stream.of(m.group(1).split(" ")).mapToInt(Integer::parseInt).toArray();
  17. for (int elt : intArray)
  18. {
  19. System.out.println((Integer)elt);
  20. }
  21. }
  22. }
  23. }
  24. }
  1. 111
  2. 103
  3. 104
  4. 9
  5. 102
  6. 0
  7. 8
  8. 106
  9. 105
  10. 13
  11. 110
  12. 112
  13. 113
  14. 126
展开查看全部
dly7yett

dly7yett2#

这对你有用吗?

  1. (m=(audio|video) \d+) \D+ ((\d+ ?)+)

把它用在https://regex101.com/ 用你的例子。
组1将是数字之前的字符串。第三组是带数字的字符串。
然后您可以将组3拆分为一个数组。
完整代码:

  1. public static void main(String[] args) {
  2. String regex = "(m=(audio|video) \\d+) \\D+ ((\\d+ ?)+)";
  3. Pattern pattern = Pattern.compile(regex);
  4. // String str = "m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 11";
  5. // String str = "m=video 9 UDP/SAVPF 0 100 102 106";
  6. // String str = "m=audio 5004 RTP/AVP 0";
  7. String str = "m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127";
  8. Matcher matcher = pattern.matcher(str);
  9. if (matcher.matches()) {
  10. String g1 = matcher.group(1);
  11. String g3 = matcher.group(3);
  12. System.out.println(g1);
  13. System.out.println(g3);
  14. String[] numbers = g3.split(" ");
  15. for (String n : numbers) {
  16. System.out.println(n);
  17. }
  18. }
  19. }
展开查看全部

相关问题