我的编程空间,编程开发者的网络收藏夹
学习永远不晚

为什么pion/webrtc生成候选列表没有tcp地址

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

为什么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=sclass="lazy" data-src:554659860 cname:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031
a=sclass="lazy" data-src:554659860 msid:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031 video
a=sclass="lazy" data-src:554659860 mslabel:rtckit/53bd9691-40c4-4a58-9165-c7579c4b5031
a=sclass="lazy" data-src: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地址的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

为什么pion/webrtc生成候选列表没有tcp地址

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

为什么pion/webrtc生成候选列表没有tcp地址

问题内容我想使用golang pion/webrtc将本地视频文件发布到视频服务器,这个视频服务器只支持tcp连接,当我通过pion/webrtc代码生成offer sdp时,候选列表没有一个tcp候选,所以ice连接失败。当我使用ch
为什么pion/webrtc生成候选列表没有tcp地址
2024-02-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录