为什么 Pion/WebRTC 生成的候选列表中没有 TCP 地址?

huangapple go评论131阅读模式
英文:

why there pion/webrtc generate candidate list have no tcp address

问题

我想使用golang的pion/webrtc库将本地视频文件发布到一个视频服务器,但是这个视频服务器只支持TCP连接。当我使用pion/webrtc代码生成offer SDP并且候选者列表中没有TCP候选者时,ICE连接失败。

当我使用Chrome作为webrtc客户端发布摄像头视频时,它是成功的,我不知道如何让Chrome禁用TCP候选者,我检查了来自Chrome和pion/webrtc的候选者,我发现它们之间的区别在于TCP地址,我尝试了所有方法让pion/webrtc生成一个TCP候选者地址,但都失败了,请帮助我。

这是我的代码:

  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. "path/filepath"
  7. "sync"
  8. "time"
  9. "github.com/google/uuid"
  10. "github.com/pion/webrtc/v3"
  11. "github.com/pion/webrtc/v3/pkg/media"
  12. "github.com/pion/webrtc/v3/pkg/media/h264reader"
  13. )
  14. func main() {
  15. // 创建PeerConnection配置
  16. config := webrtc.Configuration{
  17. ICEServers: []webrtc.ICEServer{
  18. {
  19. URLs: []string{"stun:stun.l.google.com:19302"},
  20. },
  21. },
  22. ICETransportPolicy: webrtc.ICETransportPolicyAll,
  23. }
  24. // 创建PeerConnection
  25. peerConnection, err := webrtc.NewPeerConnection(config)
  26. if err != nil {
  27. panic(err)
  28. }
  29. videoTrack, err := NewH264LocalStaticSampleVideoTrack("test.h264", 25)
  30. if err != nil {
  31. panic(err)
  32. }
  33. if rtpSender, err := peerConnection.AddTrack(videoTrack); err != nil {
  34. panic(err)
  35. } else {
  36. go func() {
  37. for {
  38. buf := make([]byte, 1024*1024)
  39. var rtcpErr error
  40. if _, _, rtcpErr = rtpSender.Read(buf); rtcpErr != nil {
  41. fmt.Printf("read error: %v", rtcpErr.Error())
  42. return
  43. }
  44. }
  45. }()
  46. }
  47. offer, err := peerConnection.CreateOffer(nil)
  48. if err != nil {
  49. panic(err)
  50. }
  51. err = peerConnection.SetLocalDescription(offer)
  52. if err != nil {
  53. panic(err)
  54. }
  55. wait := webrtc.GatheringCompletePromise(peerConnection)
  56. <-wait
  57. fmt.Printf("Local SDP: %v", peerConnection.LocalDescription().SDP)
  58. }
  59. func NewH264LocalStaticSampleVideoTrack(videoFile string, fps int) (videoTrack *webrtc.TrackLocalStaticSample, err error) {
  60. if videoFile == "" {
  61. err = fmt.Errorf("videoFile is empty")
  62. return
  63. }
  64. var videoFileAbs string
  65. videoFileAbs, err = filepath.Abs(videoFile)
  66. if err != nil {
  67. return
  68. }
  69. _, err = os.Stat(videoFileAbs)
  70. if err != nil {
  71. return
  72. }
  73. videoTrack, err = webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{
  74. MimeType: webrtc.MimeTypeH264,
  75. }, "video", fmt.Sprintf("rtckit/%s", uuid.New().String()))
  76. if err != nil {
  77. return
  78. }
  79. go h264VideoFileConsumer(videoTrack, videoFileAbs, time.Duration(1000/fps)*time.Millisecond)
  80. return
  81. }
  82. func h264VideoFileConsumer(videoTrack *webrtc.TrackLocalStaticSample, videoFile string, videoFps time.Duration) {
  83. for {
  84. file, h264Err := os.Open(videoFile)
  85. if h264Err != nil {
  86. continue
  87. }
  88. h264, h264Err := h264reader.NewReader(file)
  89. if h264Err != nil {
  90. continue
  91. }
  92. buf := make(chan []byte, 1024*1024) // 1MB?
  93. var wg sync.WaitGroup
  94. wg.Add(2)
  95. go func() {
  96. defer wg.Done()
  97. for data := range buf {
  98. sample := media.Sample{Data: data, Duration: videoFps}
  99. if h264Err1 := videoTrack.WriteSample(sample); h264Err1 != nil {
  100. continue
  101. }
  102. }
  103. }()
  104. go func() {
  105. defer wg.Done()
  106. ticker := time.NewTicker(videoFps)
  107. for ; true; <-ticker.C {
  108. nal, h264Err := h264.NextNAL()
  109. if h264Err == io.EOF {
  110. break
  111. }
  112. if h264Err != nil {
  113. break
  114. }
  115. buf <- nal.Data
  116. }
  117. close(buf)
  118. }()
  119. wg.Wait()
  120. _ = file.Close()
  121. }
  122. }

这是我得到的offer:

  1. offer2: v=0
  2. o=- 3976125905671053001 1681720949 IN IP4 0.0.0.0
  3. s=-
  4. t=0 0
  5. a=fingerprint:sha-256 31:A1:C7:4B:05:14:A3:7E:FE:CA:9C:4D:91:F0:29:6C:01:BF:20:67:DF:AA:EA:06:29:A4:DD:3F:F0:AA:5B:BD
  6. a=extmap-allow-mixed
  7. a=group:BUNDLE 0
  8. m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 123 118 116
  9. c=IN IP4 0.0.0.0
  10. a=setup:actpass
  11. a=mid:0
  12. a=ice-ufrag:ZjDGAGZtPHgWMfWa
  13. a=ice-pwd:bJJRYUMfPcshoPCHTSfkyfrzwiJIiQkm
  14. a=rtcp-mux
  15. a=rtcp-rsize
  16. a=rtpmap:96 VP8/90000
  17. a=rtcp-fb:96 goog-remb
  18. a=rtcp-fb:96 ccm fir
  19. a=rtcp-fb:96 nack
  20. a=rtcp-fb:96 nack pli
  21. a=rtcp-fb:96 nack
  22. a=rtcp-fb:96 nack pli
  23. a=rtcp-fb:96 transport-cc
  24. a=rtpmap:97 rtx/90000
  25. a=fmtp:97 apt=96
  26. a=rtcp-fb:97 nack
  27. a=rtcp-fb:97 nack pli
  28. a=rtcp-fb:97 transport-cc
  29. a=rtpmap:98 VP9/90000
  30. a=fmtp:98 profile-id=0
  31. a=rtcp-fb:98 goog-remb
  32. a=rtcp-fb:98 ccm fir
  33. a=rtcp-fb:98 nack
  34. a=rtcp-fb:98 nack pli
  35. a=rtcp-fb:98 nack
  36. a=rtcp-fb:98 nack pli
  37. a=rtcp-fb:98 transport-cc
  38. a=rtpmap:99 rtx/90000
  39. a=fmtp:99 apt=98
  40. a=rtcp-fb:99 nack
  41. a=rtcp-fb:99 nack pli
  42. a=rtcp-fb:99 transport-cc
  43. a=rtpmap:100 VP9/90000
  44. a=fmtp:100 profile-id=1
  45. a=rtcp-fb:100 goog-remb
  46. a=rtcp-fb:100 ccm fir
  47. a=rtcp-fb:100 nack
  48. a=rtcp-fb:100 nack pli
  49. a=rtcp-fb:100 nack
  50. a=rtcp-fb:100 nack pli
  51. a=rtcp-fb:100 transport-cc
  52. a=rtpmap:101 rtx/90000
  53. a=fmtp:101 apt=100
  54. a=rtcp-fb:101 nack
  55. a=rtcp-fb:101 nack pli
  56. a=rtcp-fb:101 transport-cc
  57. a=rtpmap:102 H264/90000
  58. a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
  59. a=rtcp-fb:102 goog-remb
  60. a=rtcp-fb:102 ccm fir
  61. a=rtcp-fb:102 nack
  62. a=rtcp-fb:102 nack pli
  63. a=rtcp-fb:102 nack
  64. a=rtcp-fb:102 nack pli
  65. a=rtcp-fb:102 transport-cc
  66. a=rtpmap:121 rtx/90000
  67. a=fmtp:121 apt=102
  68. a=rtcp-fb:121 nack
  69. a=rtcp-fb:121 nack pli
  70. a=rtcp-fb:121 transport-cc
  71. a=rtpmap:127 H264/90000
  72. a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
  73. a=rtcp-fb:127 goog-remb
  74. a=rtcp-fb:127 ccm fir
  75. a=rtcp-fb:127 nack
  76. a=rtcp-fb:127 nack pli
  77. a=rtcp-fb:127 nack
  78. a=rtcp-fb:127 nack pli
  79. a=rtcp-fb:127 transport-cc
  80. a=rtpmap:120 rtx/90000
  81. a=fmtp:120 apt=127
  82. a=rtcp-fb:120 nack
  83. a=rtcp-fb:120 nack pli
  84. a=rtcp-fb:120 transport-cc
  85. a=rtpmap:125 H264/90000
  86. a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
  87. a=rtcp-fb:125 goog-remb
  88. a=rtcp-fb:125 ccm fir
  89. a=rtcp-fb:125 nack
  90. a=rtcp-fb:125 nack pli
  91. a=rtcp-fb:125 nack
  92. a=rtcp-fb:125 nack pli
  93. a=rtcp-fb:125 transport-cc
  94. a=rtpmap:107 rtx/90000
  95. a=fmtp:107 apt=125
  96. a=rtcp-fb:107 nack
  97. a=rtcp-fb:107 nack pli
  98. a=rtcp-fb:107 transport-cc
  99. a=rtpmap:108 H264/90000
  100. a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
  101. a=rtcp-fb:108 goog-remb
  102. a=rtcp-fb:108 ccm fir
  103. a=rtcp-fb:108 nack
  104. a=rtcp-fb:108 nack pli
  105. a=rtcp-fb:108 nack
  106. a=rtcp-fb:108 nack pli
  107. a=rtcp-fb:108 transport-cc
  108. a=rtpmap:109 rtx/90000
  109. a=fmtp:109 apt=108
  110. a=rtcp-fb:109 nack
  111. a=rtcp-fb:109 nack pli
  112. a=rtcp-fb:109 transport-cc
  113. a=rtpmap:123 H264/90000
  114. a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032
  115. a=rtcp-fb:123 goog-remb
  116. a=rtcp-fb:123 ccm fir
  117. a=rtcp-fb:123 nack
  118. a=rtcp-fb:123 nack pli
  119. a=rtcp-fb:123 nack
  120. a=rtcp-fb:123 nack pli
  121. a=rtcp-fb:123 transport-cc
  122. a=rtpmap:118 rtx/90000
  123. a=fmtp:118 apt=123
  124. a=rtcp-fb:118 nack
  125. a=rtcp-fb:118 nack pli
  126. a=rtcp-fb:118 transport-cc
  127. a=rtpmap:116 ulpfec/90000
  128. a=rtcp-fb:116 nack
  129. a=rtcp-fb:116 nack pli
  130. a=rtcp-fb:116 transport-cc
  131. a=extmap:1 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
  132. a=ssrc:554659860 cname:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031
  133. a=ssrc:554659860 msid:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031 video
  134. a=ssrc:554659860 mslabel:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031
  135. a=ssrc:554659860 label:video
  136. a=msid:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031 video
  137. a=sendrecv
  138. a=candidate:4113284106 1 udp 2130706431 101.4.122.16 41267 typ host
  139. a=candidate:4113284106 2 udp 2130706431 101.4.122.16 41267 typ host
  140. a=candidate:3528925834 1 udp 2130706431 172.18.0.1 33655 typ host
  141. a=candidate:3528925834 2 udp 2130706431 172.18.0.1 33655 typ host
  142. a=candidate:233762139 1 udp 2130706431 172.17.0.1 53508 typ host
  143. a=candidate:233762139 2 udp 2130706431 172.17.0.1 53508 typ host
  144. a=candidate:300762037 1 udp 1694498815 178.173.224.70 56107 typ srflx raddr 0.0.0.0 rport 56107
  145. a=candidate:300762037 2 udp 1694498815 178.173.224.70 56107 typ srflx raddr 0.0.0.0 rport 56107
  146. a=end-of-candidates

祝一切顺利~

英文:

I want use golang pion/webrtc to publish local video file to a video server, bug this video server only support TCP connection, when i generate offer SDP by pion/webrtc code and candidate list have no one TCP candidate, so ICE connect failed.
When I use chrome as a webrtc client to publish camera video, it's success, I don't how to make chrome disable TCP candidate, I checked candidcate from chrome and pion/webrtc, I found the difference is the candidate TCP address, I tried all way to let pion/webrtc generate an TCP candidate address, but all failed, please help me.

there is my code:

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;io&quot;
  5. &quot;os&quot;
  6. &quot;path/filepath&quot;
  7. &quot;sync&quot;
  8. &quot;time&quot;
  9. &quot;github.com/google/uuid&quot;
  10. &quot;github.com/pion/webrtc/v3&quot;
  11. &quot;github.com/pion/webrtc/v3/pkg/media&quot;
  12. &quot;github.com/pion/webrtc/v3/pkg/media/h264reader&quot;
  13. )
  14. func main() {
  15. // 创建PeerConnection配置
  16. config := webrtc.Configuration{
  17. ICEServers: []webrtc.ICEServer{
  18. {
  19. URLs: []string{&quot;stun:stun.l.google.com:19302&quot;},
  20. },
  21. },
  22. ICETransportPolicy: webrtc.ICETransportPolicyAll,
  23. }
  24. // 创建PeerConnection
  25. peerConnection, err := webrtc.NewPeerConnection(config)
  26. if err != nil {
  27. panic(err)
  28. }
  29. videoTrack, err := NewH264LocalStaticSampleVideoTrack(&quot;test.h264&quot;, 25)
  30. if err != nil {
  31. panic(err)
  32. }
  33. if rtpSender, err := peerConnection.AddTrack(videoTrack); err != nil {
  34. panic(err)
  35. } else {
  36. go func() {
  37. for {
  38. buf := make([]byte, 1024*1024)
  39. var rtcpErr error
  40. if _, _, rtcpErr = rtpSender.Read(buf); rtcpErr != nil {
  41. fmt.Printf(&quot;read error: %v&quot;, rtcpErr.Error())
  42. return
  43. }
  44. }
  45. }()
  46. }
  47. offer, err := peerConnection.CreateOffer(nil)
  48. if err != nil {
  49. panic(err)
  50. }
  51. err = peerConnection.SetLocalDescription(offer)
  52. if err != nil {
  53. panic(err)
  54. }
  55. wait := webrtc.GatheringCompletePromise(peerConnection)
  56. &lt;-wait
  57. fmt.Printf(&quot;Local SDP: %v&quot;, peerConnection.LocalDescription().SDP)
  58. }
  59. func NewH264LocalStaticSampleVideoTrack(videoFile string, fps int) (videoTrack *webrtc.TrackLocalStaticSample, err error) {
  60. if videoFile == &quot;&quot; {
  61. err = fmt.Errorf(&quot;videoFile is empty&quot;)
  62. return
  63. }
  64. var videoFileAbs string
  65. videoFileAbs, err = filepath.Abs(videoFile)
  66. if err != nil {
  67. return
  68. }
  69. _, err = os.Stat(videoFileAbs)
  70. if err != nil {
  71. return
  72. }
  73. videoTrack, err = webrtc.NewTrackLocalStaticSample(webrtc.RTPCodecCapability{
  74. MimeType: webrtc.MimeTypeH264,
  75. }, &quot;video&quot;, fmt.Sprintf(&quot;rtckit/%s&quot;, uuid.New().String()))
  76. if err != nil {
  77. return
  78. }
  79. go h264VideoFileConsumer(videoTrack, videoFileAbs, time.Duration(1000/fps)*time.Millisecond)
  80. return
  81. }
  82. func h264VideoFileConsumer(videoTrack *webrtc.TrackLocalStaticSample, videoFile string, videoFps time.Duration) {
  83. for {
  84. file, h264Err := os.Open(videoFile)
  85. if h264Err != nil {
  86. continue
  87. }
  88. h264, h264Err := h264reader.NewReader(file)
  89. if h264Err != nil {
  90. continue
  91. }
  92. buf := make(chan []byte, 1024*1024) // 1MB?
  93. var wg sync.WaitGroup
  94. wg.Add(2)
  95. go func() {
  96. defer wg.Done()
  97. for data := range buf {
  98. sample := media.Sample{Data: data, Duration: videoFps}
  99. if h264Err1 := videoTrack.WriteSample(sample); h264Err1 != nil {
  100. continue
  101. }
  102. }
  103. }()
  104. go func() {
  105. defer wg.Done()
  106. ticker := time.NewTicker(videoFps)
  107. for ; true; &lt;-ticker.C {
  108. nal, h264Err := h264.NextNAL()
  109. if h264Err == io.EOF {
  110. break
  111. }
  112. if h264Err != nil {
  113. break
  114. }
  115. buf &lt;- nal.Data
  116. }
  117. close(buf)
  118. }()
  119. wg.Wait()
  120. _ = file.Close()
  121. }
  122. }

this the offer i get:

  1. offer2: v=0
  2. o=- 3976125905671053001 1681720949 IN IP4 0.0.0.0
  3. s=-
  4. t=0 0
  5. a=fingerprint:sha-256 31:A1:C7:4B:05:14:A3:7E:FE:CA:9C:4D:91:F0:29:6C:01:BF:20:67:DF:AA:EA:06:29:A4:DD:3F:F0:AA:5B:BD
  6. a=extmap-allow-mixed
  7. a=group:BUNDLE 0
  8. m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 123 118 116
  9. c=IN IP4 0.0.0.0
  10. a=setup:actpass
  11. a=mid:0
  12. a=ice-ufrag:ZjDGAGZtPHgWMfWa
  13. a=ice-pwd:bJJRYUMfPcshoPCHTSfkyfrzwiJIiQkm
  14. a=rtcp-mux
  15. a=rtcp-rsize
  16. a=rtpmap:96 VP8/90000
  17. a=rtcp-fb:96 goog-remb
  18. a=rtcp-fb:96 ccm fir
  19. a=rtcp-fb:96 nack
  20. a=rtcp-fb:96 nack pli
  21. a=rtcp-fb:96 nack
  22. a=rtcp-fb:96 nack pli
  23. a=rtcp-fb:96 transport-cc
  24. a=rtpmap:97 rtx/90000
  25. a=fmtp:97 apt=96
  26. a=rtcp-fb:97 nack
  27. a=rtcp-fb:97 nack pli
  28. a=rtcp-fb:97 transport-cc
  29. a=rtpmap:98 VP9/90000
  30. a=fmtp:98 profile-id=0
  31. a=rtcp-fb:98 goog-remb
  32. a=rtcp-fb:98 ccm fir
  33. a=rtcp-fb:98 nack
  34. a=rtcp-fb:98 nack pli
  35. a=rtcp-fb:98 nack
  36. a=rtcp-fb:98 nack pli
  37. a=rtcp-fb:98 transport-cc
  38. a=rtpmap:99 rtx/90000
  39. a=fmtp:99 apt=98
  40. a=rtcp-fb:99 nack
  41. a=rtcp-fb:99 nack pli
  42. a=rtcp-fb:99 transport-cc
  43. a=rtpmap:100 VP9/90000
  44. a=fmtp:100 profile-id=1
  45. a=rtcp-fb:100 goog-remb
  46. a=rtcp-fb:100 ccm fir
  47. a=rtcp-fb:100 nack
  48. a=rtcp-fb:100 nack pli
  49. a=rtcp-fb:100 nack
  50. a=rtcp-fb:100 nack pli
  51. a=rtcp-fb:100 transport-cc
  52. a=rtpmap:101 rtx/90000
  53. a=fmtp:101 apt=100
  54. a=rtcp-fb:101 nack
  55. a=rtcp-fb:101 nack pli
  56. a=rtcp-fb:101 transport-cc
  57. a=rtpmap:102 H264/90000
  58. a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
  59. a=rtcp-fb:102 goog-remb
  60. a=rtcp-fb:102 ccm fir
  61. a=rtcp-fb:102 nack
  62. a=rtcp-fb:102 nack pli
  63. a=rtcp-fb:102 nack
  64. a=rtcp-fb:102 nack pli
  65. a=rtcp-fb:102 transport-cc
  66. a=rtpmap:121 rtx/90000
  67. a=fmtp:121 apt=102
  68. a=rtcp-fb:121 nack
  69. a=rtcp-fb:121 nack pli
  70. a=rtcp-fb:121 transport-cc
  71. a=rtpmap:127 H264/90000
  72. a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
  73. a=rtcp-fb:127 goog-remb
  74. a=rtcp-fb:127 ccm fir
  75. a=rtcp-fb:127 nack
  76. a=rtcp-fb:127 nack pli
  77. a=rtcp-fb:127 nack
  78. a=rtcp-fb:127 nack pli
  79. a=rtcp-fb:127 transport-cc
  80. a=rtpmap:120 rtx/90000
  81. a=fmtp:120 apt=127
  82. a=rtcp-fb:120 nack
  83. a=rtcp-fb:120 nack pli
  84. a=rtcp-fb:120 transport-cc
  85. a=rtpmap:125 H264/90000
  86. a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
  87. a=rtcp-fb:125 goog-remb
  88. a=rtcp-fb:125 ccm fir
  89. a=rtcp-fb:125 nack
  90. a=rtcp-fb:125 nack pli
  91. a=rtcp-fb:125 nack
  92. a=rtcp-fb:125 nack pli
  93. a=rtcp-fb:125 transport-cc
  94. a=rtpmap:107 rtx/90000
  95. a=fmtp:107 apt=125
  96. a=rtcp-fb:107 nack
  97. a=rtcp-fb:107 nack pli
  98. a=rtcp-fb:107 transport-cc
  99. a=rtpmap:108 H264/90000
  100. a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
  101. a=rtcp-fb:108 goog-remb
  102. a=rtcp-fb:108 ccm fir
  103. a=rtcp-fb:108 nack
  104. a=rtcp-fb:108 nack pli
  105. a=rtcp-fb:108 nack
  106. a=rtcp-fb:108 nack pli
  107. a=rtcp-fb:108 transport-cc
  108. a=rtpmap:109 rtx/90000
  109. a=fmtp:109 apt=108
  110. a=rtcp-fb:109 nack
  111. a=rtcp-fb:109 nack pli
  112. a=rtcp-fb:109 transport-cc
  113. a=rtpmap:123 H264/90000
  114. a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032
  115. a=rtcp-fb:123 goog-remb
  116. a=rtcp-fb:123 ccm fir
  117. a=rtcp-fb:123 nack
  118. a=rtcp-fb:123 nack pli
  119. a=rtcp-fb:123 nack
  120. a=rtcp-fb:123 nack pli
  121. a=rtcp-fb:123 transport-cc
  122. a=rtpmap:118 rtx/90000
  123. a=fmtp:118 apt=123
  124. a=rtcp-fb:118 nack
  125. a=rtcp-fb:118 nack pli
  126. a=rtcp-fb:118 transport-cc
  127. a=rtpmap:116 ulpfec/90000
  128. a=rtcp-fb:116 nack
  129. a=rtcp-fb:116 nack pli
  130. a=rtcp-fb:116 transport-cc
  131. a=extmap:1 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
  132. a=ssrc:554659860 cname:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031
  133. a=ssrc:554659860 msid:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031 video
  134. a=ssrc:554659860 mslabel:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031
  135. a=ssrc:554659860 label:video
  136. a=msid:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031 video
  137. a=sendrecv
  138. a=candidate:4113284106 1 udp 2130706431 101.4.122.16 41267 typ host
  139. a=candidate:4113284106 2 udp 2130706431 101.4.122.16 41267 typ host
  140. a=candidate:3528925834 1 udp 2130706431 172.18.0.1 33655 typ host
  141. a=candidate:3528925834 2 udp 2130706431 172.18.0.1 33655 typ host
  142. a=candidate:233762139 1 udp 2130706431 172.17.0.1 53508 typ host
  143. a=candidate:233762139 2 udp 2130706431 172.17.0.1 53508 typ host
  144. a=candidate:300762037 1 udp 1694498815 178.173.224.70 56107 typ srflx raddr 0.0.0.0 rport 56107
  145. a=candidate:300762037 2 udp 1694498815 178.173.224.70 56107 typ srflx raddr 0.0.0.0 rport 56107
  146. a=end-of-candidates

Best withes~

I try to add ICE Server In localhost and use stun:stun.l.google.com:19302, and ask from chatGPT, it all didn't works.

答案1

得分: 2

默认情况下,Pion不启用ICE-TCP候选项。

您可以通过SettingEngine.SetICETCPMux来启用它们。

请参考examples/ice-tcp以获取如何使用此API的完整示例。

祝您好运,并感谢您使用Pion!

英文:

By default Pion doesn't enable ICE-TCP candidates.

You can enable them via the SettingEngine.SetICETCPMux

See examples/ice-tcp for a full featured example of how to use this API.

Best of luck, and thanks for using Pion!

huangapple
  • 本文由 发表于 2023年4月13日 21:09:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/76005830.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定