百万级高并发WebRTC流媒体服务器设计与开发

download:百万级高并发WebRTC流媒体服务器设计与开发

5G时代音视频为王,随着实时音视频应用的爆发,来自Google 的WebRTC成为了人们关注的焦点,但很多人却不知道如何使用WebRTC实现多人实时互动,本课就将围绕与浏览器互通、级联、可扩展等6大痛点手把手带你学习大负载、高并发、高性能 WebRTC 流媒体服务器的设计与开发,揭秘万人互动直播背后的深层奥秘,打造可负载百万用户量的企业级的流媒体服务器

适合人群
WebRTC开发人员
想实现多方通信的开发人员
音视频服务器开发人员
服务端开发人员

技术储备要求
掌握C/C++/Java语言基础
具备1-2年服务端开发经验更佳
package main
//反射,根本數據類型
import (
“fmt”
“reflect”
)
type myInt int
type Person struct {
Name string
Age int
}
func reflectType(v interface{}) {
typeOf := reflect.TypeOf(v)
name := typeOf.Name()
kind := typeOf.Kind()
fmt.Printf("【typeof】: %v, 【Name】: %v, 【Kind】: %v\n", typeOf, name, kind)
}
func reflectValue(v interface{}) {
val := reflect.ValueOf(v)
kind := val.Kind()
fmt.Println(“原始類型:”, kind)
switch kind {
case reflect.Int:
fmt.Println(val.Int())
case reflect.String:
fmt.Println(val.String())
case reflect.Float32:
fmt.Println(val.Float())
default:
fmt.Println(“還沒有去判別這個類型”)
}
}
func resetValue(v interface{}) {
val := reflect.ValueOf(v)
kind := val.Kind()
//假如傳入的參數不是指針類型,那麼就不能對其原始的變量停止赋值
//但是假如傳入的參數是指針類型,經過val.Kind()辦法獲取到的是ptr類型
//假如想要判別是int,則需求運用val.Elem().Kind()辦法
fmt.Println(kind)
k := val.Elem().Kind()
fmt.Println(“實践類型:”, k)
if k == reflect.Int64 {
val.Elem().SetInt(2323)
} else if k == reflect.String {
val.Elem().SetString(“hello golang”)
} else {
fmt.Println(“暫時沒設置這品種型”)
}
}
func main() {
a := 10
b := 12.3
c := true
d := “nihao”
var e myInt = 12
f := Person{
Name: “nihao”,
Age: 12,
}
g := [3]int{0, 1, 2}
h := []int{4, 5}
var i = &a
reflectType(a)
reflectType(b)
reflectType©
reflectType(d)
reflectType(e)
reflectType(f)
reflectType(g)
reflectType(h)
reflectType(i)
reflectValue(23)
reflectValue(“string”)
var aint = 12
resetValue(&aint)
fmt.Println(aint)
}
構造體的反射
package main
import (
“fmt”
“reflect”
)
//反射,構造體
type Person struct {
Name string json:“name”
Age int json:“age”
Address string
}
func (p Person) GetInfo() string {
return fmt.Sprintf(“Name:%v,Age:%v,Address:%v”, p.Name, p.Age, p.Address)
}
func (p *Person) SetInfo(name string, age int, address string) {
p.Name = name
p.Age = age
p.Address = address
}
func main() {
var p = Person{
Name: “silk”,
Age: 20,
Address: “蘇州”,
}
t := reflect.TypeOf§
if t.Kind() != reflect.Struct && t.Elem().Kind() != reflect.Struct {
fmt.Println(“傳入的類型不是構造體”)
}
field := t.Field(0)
fmt.Println(field.Name)
fmt.Println(field.Type)
fmt.Println(field.Tag.Get(“json”))
name, ok := t.FieldByName(“Age”)
if ok {
fmt.Println(name.Name)
fmt.Println(name.Type)
fmt.Println(name.Tag.Get(“json”))
}
for i := 0; i < t.NumField(); i++ {
fmt.Printf(“name:%v,type:%v,tag:%v\n”, t.Field(i).Name, t.Field(i).Type, t.Field(i).Tag.Get(“json”))
}
method := t.NumMethod()
fmt.Println(“methodcount:”, method)
for i := 0; i < method; i++ {
fmt.Println(t.Method(i).Name)
}
//留意,當運用SetInfo辦法時分,傳入的必需是指針類型,否則會報錯
val := reflect.ValueOf(&p)
call := val.MethodByName(“GetInfo”).Call(nil)
fmt.Println(call)
var params []reflect.Value
params = append(params, reflect.ValueOf(“java0904”))
params = append(params, reflect.ValueOf(23))
params = append(params, reflect.ValueOf(“蘇州市工業園區”))
val.MethodByName(“SetInfo”).Call(params)
call = val.MethodByName(“GetInfo”).Call(nil)
fmt.Println(call)
fmt.Println§
}

上一篇:[webrtc] 接收端 webrtc BWE 判断


下一篇:白话解读 WebRTC 音频 NetEQ 及优化实践