为什么pion/webrtc生成候选列表没有tcp地址
我想使用golang pion/webrtc将本地视频文件发布到视频服务器,这个视频服务器只支持tcp连接,当我通过pion/webrtc代码生成offer sdp时,候选列表没有一个tcp候选,所以ice连接失败。 当我使用chrome作为webrtc客户端发布摄像头视频时,它成功了,我不知道如何让chrome禁用tcp候选,我检查了chrome和pion/webrtc的候选,我发现区别在于候选tcp地址,我尝试过想尽办法让pion/webrtc生成tcp候选地址,但都失败了,请帮帮我。
这是我的代码:
package main import ( "fmt" "io" "os" "path/filepath" "sync" "time" "github.com/google/uuid" "github.com/pion/webrtc/v3" "github.com/pion/webrtc/v3/pkg/media" "github.com/pion/webrtc/v3/pkg/media/h264reader" ) func main() { // 创建peerconnection配置 config := webrtc.configuration{ iceservers: []webrtc.iceserver{ { urls: []string{"stun:stun.l.google.com:19302"}, }, }, icetransportpolicy: webrtc.icetransportpolicyall, } // 创建peerconnection peerconnection, err := webrtc.newpeerconnection(config) if err != nil { panic(err) } videotrack, err := newh264localstaticsamplevideotrack("test.h264", 25) if err != nil { panic(err) } if rtpsender, err := peerconnection.addtrack(videotrack); err != nil { panic(err) } else { go func() { for { buf := make([]byte, 1024*1024) var rtcperr error if _, _, rtcperr = rtpsender.read(buf); rtcperr != nil { fmt.printf("read error: %v", rtcperr.error()) return } } }() } offer, err := peerconnection.createoffer(nil) if err != nil { panic(err) } err = peerconnection.setlocaldescription(offer) if err != nil { panic(err) } wait := webrtc.gatheringcompletepromise(peerconnection) <-wait fmt.printf("local sdp: %v", peerconnection.localdescription().sdp) } func newh264localstaticsamplevideotrack(videofile string, fps int) (videotrack *webrtc.tracklocalstaticsample, err error) { if videofile == "" { err = fmt.errorf("videofile is empty") return } var videofileabs string videofileabs, err = filepath.abs(videofile) if err != nil { return } _, err = os.stat(videofileabs) if err != nil { return } videotrack, err = webrtc.newtracklocalstaticsample(webrtc.rtpcodeccapability{ mimetype: webrtc.mimetypeh264, }, "video", fmt.sprintf("rtckit/%s", uuid.new().string())) if err != nil { return } go h264videofileconsumer(videotrack, videofileabs, time.duration(1000/fps)*time.millisecond) return } func h264videofileconsumer(videotrack *webrtc.tracklocalstaticsample, videofile string, videofps time.duration) { for { file, h264err := os.open(videofile) if h264err != nil { continue } h264, h264err := h264reader.newreader(file) if h264err != nil { continue } buf := make(chan []byte, 1024*1024) // 1mb? var wg sync.waitgroup wg.add(2) go func() { defer wg.done() for data := range buf { sample := media.sample{data: data, duration: videofps} if h264err1 := videotrack.writesample(sample); h264err1 != nil { continue } } }() go func() { defer wg.done() ticker := time.newticker(videofps) for ; true; <-ticker.c { nal, h264err := h264.nextnal() if h264err == io.eof { break } if h264err != nil { break } buf <- nal.data } close(buf) }() wg.wait() _ = file.close() } }
这是我得到的报价:
offer2: v=0 o=- 3976125905671053001 1681720949 IN IP4 0.0.0.0 s=- t=0 0 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 a=extmap-allow-mixed a=group:BUNDLE 0 m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 121 127 120 125 107 108 109 123 118 116 c=IN IP4 0.0.0.0 a=setup:actpass a=mid:0 a=ice-ufrag:ZjDGAGZtPHgWMfWa a=ice-pwd:bJJRYUMfPcshoPCHTSfkyfrzwiJIiQkm a=rtcp-mux a=rtcp-rsize a=rtpmap:96 VP8/90000 a=rtcp-fb:96 goog-remb a=rtcp-fb:96 ccm fir a=rtcp-fb:96 nack a=rtcp-fb:96 nack pli a=rtcp-fb:96 nack a=rtcp-fb:96 nack pli a=rtcp-fb:96 transport-cc a=rtpmap:97 rtx/90000 a=fmtp:97 apt=96 a=rtcp-fb:97 nack a=rtcp-fb:97 nack pli a=rtcp-fb:97 transport-cc a=rtpmap:98 VP9/90000 a=fmtp:98 profile-id=0 a=rtcp-fb:98 goog-remb a=rtcp-fb:98 ccm fir a=rtcp-fb:98 nack a=rtcp-fb:98 nack pli a=rtcp-fb:98 nack a=rtcp-fb:98 nack pli a=rtcp-fb:98 transport-cc a=rtpmap:99 rtx/90000 a=fmtp:99 apt=98 a=rtcp-fb:99 nack a=rtcp-fb:99 nack pli a=rtcp-fb:99 transport-cc a=rtpmap:100 VP9/90000 a=fmtp:100 profile-id=1 a=rtcp-fb:100 goog-remb a=rtcp-fb:100 ccm fir a=rtcp-fb:100 nack a=rtcp-fb:100 nack pli a=rtcp-fb:100 nack a=rtcp-fb:100 nack pli a=rtcp-fb:100 transport-cc a=rtpmap:101 rtx/90000 a=fmtp:101 apt=100 a=rtcp-fb:101 nack a=rtcp-fb:101 nack pli a=rtcp-fb:101 transport-cc a=rtpmap:102 H264/90000 a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f a=rtcp-fb:102 goog-remb a=rtcp-fb:102 ccm fir a=rtcp-fb:102 nack a=rtcp-fb:102 nack pli a=rtcp-fb:102 nack a=rtcp-fb:102 nack pli a=rtcp-fb:102 transport-cc a=rtpmap:121 rtx/90000 a=fmtp:121 apt=102 a=rtcp-fb:121 nack a=rtcp-fb:121 nack pli a=rtcp-fb:121 transport-cc a=rtpmap:127 H264/90000 a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f a=rtcp-fb:127 goog-remb a=rtcp-fb:127 ccm fir a=rtcp-fb:127 nack a=rtcp-fb:127 nack pli a=rtcp-fb:127 nack a=rtcp-fb:127 nack pli a=rtcp-fb:127 transport-cc a=rtpmap:120 rtx/90000 a=fmtp:120 apt=127 a=rtcp-fb:120 nack a=rtcp-fb:120 nack pli a=rtcp-fb:120 transport-cc a=rtpmap:125 H264/90000 a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f a=rtcp-fb:125 goog-remb a=rtcp-fb:125 ccm fir a=rtcp-fb:125 nack a=rtcp-fb:125 nack pli a=rtcp-fb:125 nack a=rtcp-fb:125 nack pli a=rtcp-fb:125 transport-cc a=rtpmap:107 rtx/90000 a=fmtp:107 apt=125 a=rtcp-fb:107 nack a=rtcp-fb:107 nack pli a=rtcp-fb:107 transport-cc a=rtpmap:108 H264/90000 a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f a=rtcp-fb:108 goog-remb a=rtcp-fb:108 ccm fir a=rtcp-fb:108 nack a=rtcp-fb:108 nack pli a=rtcp-fb:108 nack a=rtcp-fb:108 nack pli a=rtcp-fb:108 transport-cc a=rtpmap:109 rtx/90000 a=fmtp:109 apt=108 a=rtcp-fb:109 nack a=rtcp-fb:109 nack pli a=rtcp-fb:109 transport-cc a=rtpmap:123 H264/90000 a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032 a=rtcp-fb:123 goog-remb a=rtcp-fb:123 ccm fir a=rtcp-fb:123 nack a=rtcp-fb:123 nack pli a=rtcp-fb:123 nack a=rtcp-fb:123 nack pli a=rtcp-fb:123 transport-cc a=rtpmap:118 rtx/90000 a=fmtp:118 apt=123 a=rtcp-fb:118 nack a=rtcp-fb:118 nack pli a=rtcp-fb:118 transport-cc a=rtpmap:116 ulpfec/90000 a=rtcp-fb:116 nack a=rtcp-fb:116 nack pli a=rtcp-fb:116 transport-cc a=extmap:1 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01 a=ssrc:554659860 cname:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031 a=ssrc:554659860 msid:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031 video a=ssrc:554659860 mslabel:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031 a=ssrc:554659860 label:video a=msid:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031 video a=sendrecv a=candidate:4113284106 1 udp 2130706431 101.4.122.16 41267 typ host a=candidate:4113284106 2 udp 2130706431 101.4.122.16 41267 typ host a=candidate:3528925834 1 udp 2130706431 172.18.0.1 33655 typ host a=candidate:3528925834 2 udp 2130706431 172.18.0.1 33655 typ host a=candidate:233762139 1 udp 2130706431 172.17.0.1 53508 typ host a=candidate:233762139 2 udp 2130706431 172.17.0.1 53508 typ host a=candidate:300762037 1 udp 1694498815 178.173.224.70 56107 typ srflx raddr 0.0.0.0 rport 56107 a=candidate:300762037 2 udp 1694498815 178.173.224.70 56107 typ srflx raddr 0.0.0.0 rport 56107 a=end-of-candidates
最好的搭配~
我尝试在本地主机中添加ice服务器并使用stun:stun.l.google.com:19302
,并向chatgpt询问,这一切都不起作用。
正确答案
默认情况下,Pion 不启用 ICE-TCP 候选项。
您可以通过SettingEngine.SetICETCPMux一个>
请参阅 examples/ice-tcp 了解完整信息如何使用此 API 的精选示例。
祝您好运,感谢您使用 Pion!
以上是为什么pion/webrtc生成候选列表没有tcp地址的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

本文演示了创建模拟和存根进行单元测试。 它强调使用接口,提供模拟实现的示例,并讨论最佳实践,例如保持模拟集中并使用断言库。 文章

本文探讨了GO的仿制药自定义类型约束。 它详细介绍了界面如何定义通用功能的最低类型要求,从而改善了类型的安全性和代码可重复使用性。 本文还讨论了局限性和最佳实践

本文讨论了GO的反思软件包,用于运行时操作代码,对序列化,通用编程等有益。它警告性能成本,例如较慢的执行和更高的内存使用,建议明智的使用和最佳

本文使用跟踪工具探讨了GO应用程序执行流。 它讨论了手册和自动仪器技术,比较诸如Jaeger,Zipkin和Opentelemetry之类的工具,并突出显示有效的数据可视化

本文讨论了GO中使用表驱动的测试,该方法使用测试用例表来测试具有多个输入和结果的功能。它突出了诸如提高的可读性,降低重复,可伸缩性,一致性和A
