• 流媒体跳坑: 02-视频会议:Webrtc服务器


    视频会议:Webrtc服务器

     当前免费视频服务器选择:

    1.Intel Collaboration Suite for WebRTC
    2.janus
    3.Jitsi VideoBridge
    4.Kurento
    5.Licode
    6.Meedooze
    7.MediaSoup

    大体查看了一下,根本hold不住,  免费的都是各种坑, 一个个跳估计要很久,   想舒舒服服的使用基本不可能.........

    没办法,自己实现一个SFU , 

    1.  怎么简单怎么来,  使用golang , 再设计一个发布定阅:

    type PublisherMap struct {
        mutex       sync.RWMutex          // 读写锁
        pub_keyList []string              // id列表 用于排序
        Publishers  map[string]*Publisher // 订阅者信息
    
        sub_keyList []string               // id列表 用于排序
        Sublishers  map[string]*Subscriber // 订阅者信息
    }
    
    var single *PublisherMap
    
    func GetSingle() *PublisherMap {
        if single == nil {
            single = &PublisherMap{}
            single.Publishers = make(map[string]*Publisher)
            single.Sublishers = make(map[string]*Subscriber)
        }
    
        return single
    }
    
    func (this *PublisherMap) AddPublisher(publish *Publisher) {
    
        single.mutex.Lock()
        defer single.mutex.Unlock()
    
        single.pub_keyList = append(single.pub_keyList, publish.Id)
        single.Publishers[publish.Id] = publish
    
    }
    
    func (this *PublisherMap) RemovePublisher(publisher_id string) {
        single.mutex.Lock()
        defer single.mutex.Unlock()
    
        //删除指定
        new_list := single.pub_keyList[:0]
        for _, v := range single.pub_keyList {
            if v != publisher_id {
                new_list = append(new_list, v)
            }
        }
        single.pub_keyList = new_list
        delete(single.Publishers, publisher_id)
    
    }
    
    func (this *PublisherMap) GetPublisher(id string) *Publisher {
    
        single.mutex.Lock()
        defer single.mutex.Unlock()
    
        for k, v := range single.Publishers {
    
            fmt.Println(" for ------------- ", k, id)
    
            if k == id {
                return v
            }
        }
    
        return nil
    }
    
    func (this *PublisherMap) GetPublisherList() interface{} {
    
        //复制一份发布者列表..
        var cache []*Publisher
    
        single.mutex.Lock()
        defer single.mutex.Unlock()
    
        for _, v := range single.pub_keyList {
            single.Publishers[v].UpdateTimeLen()
            cache = append(cache, single.Publishers[v])
        }
    
        return cache
    }
    
    func (this *PublisherMap) AddSubscriber(sublisher *Subscriber) {
    
        single.mutex.Lock()
        defer single.mutex.Unlock()
    
        single.sub_keyList = append(single.sub_keyList, sublisher.Id)
        single.Sublishers[sublisher.Id] = sublisher
    
        //向发布中增加
        for _, publisher := range single.Publishers {
            if publisher.Id == sublisher.Publisher_id {
                publisher.AddSubscriber(sublisher)
            }
        }
    
    }
    
    func (this *PublisherMap) RemoveSublisher(sublisher_id string) error {
        single.mutex.Lock()
        defer single.mutex.Unlock()
    
        //删除指定
        new_list := single.sub_keyList[:0]
        for _, v := range single.sub_keyList {
            if v != sublisher_id {
                new_list = append(new_list, v)
            }
        }
        single.sub_keyList = new_list
        delete(single.Sublishers, sublisher_id)
    
        // 从发布中删除
        for _, publisher := range single.Publishers {
            publisher.RemoveSubscriber(sublisher_id)
        }
    
        return nil
    }
    
    func (this *PublisherMap) GetSubscriber(id string) *Subscriber {
    
        single.mutex.Lock()
        defer single.mutex.Unlock()
    
        for k, v := range single.Sublishers {
    
            fmt.Println(" for ------------- ", k, id)
    
            if k == id {
                return v
            }
        }
    
        return nil
    }
    
    func (this *PublisherMap) GetSublisherList() []*Subscriber {
    
        //复制一份发布者列表..
        var cache []*Subscriber
    
        single.mutex.Lock()
        defer single.mutex.Unlock()
    
        for _, v := range single.pub_keyList {
            sub_list := single.Publishers[v].GetSubscriberList()
            for _, sub := range sub_list {
                cache = append(cache, sub)
            }
        }
    
        return cache
    }

    2.  设计一个简单测试, 这部分有HTML 部分,太麻烦,不发了.  直接上个效果图

    (左面原视频: 右边是远程视频) 

     

     

    实时性没有问题.

    画面细节有瑕疵(第一张图,毛细血管细微部分看不清), 感觉不好, 一般用足够,但如果医疗使用则有问题.

    增加码率没用, 估计WebRTC有码率上限, 换换其它办法..再试

    正在整.....

  • 相关阅读:
    DOM操作创建表格
    基于insertBefore函数编写insertAfter函数
    兼容浏览器将NodeList对象转换为数组
    创建对象
    对象属性
    常用命令
    play framework
    Intellij Idea 15 注册方法
    eclipse 背景色调整,设置成护眼色(豆沙绿)
    查看Eclipse版本号,及各个版本区别
  • 原文地址:https://www.cnblogs.com/signal/p/13053644.html
Copyright © 2020-2023  润新知