范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

livekt服务端部署

  硬件需求:需要一台公网服务器  需要共有的redis  需要两个https的,同时指向服务器  服务器安装docker和Docker Compose 和 Caddy  进行安装docker run --rm -it -v$PWD:/output livekit/generate在安装的过程中会让输入服务的域名和turn的域名  然后在配置文件进行修改指定的redis  进行测试
  使用网址 :https://livekit.io/connection-test  livekt服务端部署硬件需求
  需要固定ip的服务器一台 用于部署通话服务 安装redis并且修改专门的配置  redis的配置open /usr/local/etc/redis.conf and comment out the line that says bind 127.0.0.1  change protected-mode yes to protected-mode no in the same file  进行部署通话服务
  docker run --rm -v$PWD:/output livekit/generate --local
  然后运行服务器 :ws://localhost:7880  修改配置文件找到指定的目录:/root 目录下面的livekit.yaml  进行修改配置 redis  redis:    # redis is recommended for production deploys   address: 172.17.0.1:6379 然后运行服务器
  docker run --rm -p 7880:7880
  -p 7881:7881
  -p 7882:7882/udp
  -v $PWD/livekit.yaml:/livekit.yaml
  livekit/livekit-server
  --config /livekit.yaml
  --node-ip=127.0.0.1  进行ws转为wss的操作(使用nginx)
  必须使用服务器的443端口
  然后进行nginx的配置    server {         listen 443 ssl;          server_name 域名;         ssl_certificate 文件的地址;          ssl_certificate_key 文件的地址;          ssl_session_timeout 5m;         ssl_protocols TLSv1.2 TLSv1.3;         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;          ssl_prefer_server_ciphers on;         location / {          proxy_pass http://localhost:7880/; 	 proxy_http_version 1.1;          proxy_set_header Upgrade $http_upgrade;          proxy_set_header Connection "Upgrade";         }
  即可完成本地的wss的配置  进行测试是否可用和压力测试
  livekit-load-tester --url wss://域名 --api-key 指令key --api-secret 鉴权指令 --room test-room --publishers 1 --subscribers 100 --duration 5m  使用golang进行编写通信服务器// 创建服务的链接 func CreateFactory(https bool) *lksdk.RoomServiceClient { 	// 定义数据的类型 	var roomClient *lksdk.RoomServiceClient 	if https { 		host := "https://" + yml_config.CrateYamlFactory().GetString("Livekit.Url") 		apiKey := yml_config.CrateYamlFactory().GetString("Livekit.apiKey") 		apiSecret := yml_config.CrateYamlFactory().GetString("Livekit.apiSecret") 		roomClient = lksdk.NewRoomServiceClient(host, apiKey, apiSecret) 	} else { 		host := yml_config.CrateYamlFactory().GetString("Livekit.Host") 		apiKey := yml_config.CrateYamlFactory().GetString("Livekit.apiKey") 		apiSecret := yml_config.CrateYamlFactory().GetString("Livekit.apiSecret") 		roomClient = lksdk.NewRoomServiceClient(host, apiKey, apiSecret) 	} 	return roomClient }  // 创建推流的服务器数据 func CreateNewEgressClient() *lksdk.EgressClient { 	host := "https://" + yml_config.CrateYamlFactory().GetString("Livekit.Url") 	apiKey := yml_config.CrateYamlFactory().GetString("Livekit.apiKey") 	apiSecret := yml_config.CrateYamlFactory().GetString("Livekit.apiSecret") 	egressClient := lksdk.NewEgressClient(host, apiKey, apiSecret) 	return egressClient }  // 创建房间 func CreatRoom(roomName string) (*livekit.Room, error) { 	roomClient := CreateFactory(false) 	// create a new room 	room, err := roomClient.CreateRoom(context.Background(), &livekit.CreateRoomRequest{ 		Name: roomName, 	}) 	return room, err }  // 获取房间的列表 => 判断房间是否存在 func ListRoom(rooName string) (bool, error) { 	//定义是否存在这个房间 	Flag := false 	roomClient := CreateFactory(false) 	res, err := roomClient.ListRooms(context.Background(), &livekit.ListRoomsRequest{}) 	if err != nil { 		return Flag, err 	} 	// 在判断房间是否为空 	rooms := res.Rooms 	if rooms == nil { 		return Flag, err 	} 	//	房间不为空 	for _, room := range rooms { 		if room.Name == rooName { 			Flag = true 		} 	} 	return Flag, err }  //销毁房间终止会议室并导致参与者离开 func DestroyRoom(roomId string) { 	roomClient := CreateFactory(false) 	roomClient.DeleteRoom(context.Background(), &livekit.DeleteRoomRequest{ 		Room: roomId, 	}) }  //断开某人和会议的链接 =》断开参与者与会议室的连接 func DestroyPeople(roomName, identity string) { 	roomClient := CreateFactory(false) 	roomClient.RemoveParticipant(context.Background(), &livekit.RoomParticipantIdentity{ 		Room:     roomName, 		Identity: identity, 	}) }  // 列出房间中的参与者 func ListRoomPeople(roomName string) *livekit.ListParticipantsResponse { 	roomClient := CreateFactory(false) 	res, _ := roomClient.ListParticipants(context.Background(), &livekit.ListParticipantsRequest{ 		Room: roomName, 	}) 	return res }  // 创建房间的token func GetJoinToken(room, identity string) (string, error) { 	at := auth.NewAccessToken(yml_config.CrateYamlFactory().GetString("Livekit.apiKey"), yml_config.CrateYamlFactory().GetString("Livekit.apiSecret")) 	grant := &auth.VideoGrant{ 		RoomJoin: true, 		Room:     room, 	} 	at.AddGrant(grant). 		SetIdentity(identity). 		SetValidFor(time.Hour)  	return at.ToJWT() }  //后台参数会议 =》可以进行本地的文件在里面进行播放 func ParticipationOne(host, apiKey, apiSecret, roomName, identity string) { 	roomCB := &lksdk.RoomCallback{ 		ParticipantCallback: lksdk.ParticipantCallback{ 			OnTrackSubscribed: trackSubscribed, 		}, 	} 	room, err := lksdk.ConnectToRoom(host, lksdk.ConnectInfo{ 		APIKey:              apiKey, 		APISecret:           apiSecret, 		RoomName:            roomName, 		ParticipantIdentity: identity, 	}, roomCB) 	if err != nil { 		panic(err) 	}  	//	操作结束后 	room.Disconnect()  }  // 已按计划订阅 func trackSubscribed(track *webrtc.TrackRemote, publication *lksdk.RemoteTrackPublication, rp *lksdk.RemoteParticipant) {  }  //定义后台接收视频进行存储的操作 func PreservationVideo(RoomName string, RTMP string) error { 	egressClient := CreateNewEgressClient() 	streamRequest := &livekit.RoomCompositeEgressRequest{ 		RoomName:  RoomName, 		VideoOnly: true, 		AudioOnly: true, 		Layout:    "speaker-dark", 		Output: &livekit.RoomCompositeEgressRequest_Stream{ 			Stream: &livekit.StreamOutput{ 				Protocol: livekit.StreamProtocol_RTMP, 				Urls:     []string{RTMP}, 			}, 		}, 	} 	egress, err := egressClient.StartRoomCompositeEgress(context.Background(), streamRequest) 	fmt.Printf("错误是====>:%s ", err) 	fmt.Printf("信息是====>:%s ", egress) 	return err }  // 定义房间发送消息 func UpdateMetaData(room, identity string, values interface{}) error { 	roomClient := CreateFactory(true) 	data, err := json.Marshal(values) 	participant, err := roomClient.UpdateParticipant(context.Background(), &livekit.UpdateParticipantRequest{ 		Room:     room, 		Identity: identity, 		Metadata: string(data), 	}) 	fmt.Printf("s信息====>:%s ", participant) 	fmt.Printf("错误是====>:%s ", err) 	return err }  // 删除房间 func DeleteRoom(roomName string) (*livekit.DeleteRoomResponse, error) { 	roomClient := CreateFactory(true) 	room, err := roomClient.DeleteRoom(context.Background(), &livekit.DeleteRoomRequest{ 		Room: roomName, 	}) 	fmt.Printf("关闭房间错误是====>:%s ", err) 	return room, err }  使用网址进行测试
  https://livekit.io/  定义出口流的操作定义配置文件
  在/root/livekit-egress 里面创建文件:cat config.yaml  log_level: debug api_key: APIRbNLHcS9nF5j api_secret: qwexJ82foYZfXKcGbWphKlibCRyfetsBgMS81gersgSP ws_url: ws://172.17.0.1:7880 insecure: true redis:   address: 172.17.0.1:6379   db: 4  部署出口服务器
  docker run --rm
  -e EGRESS_CONFIG_FILE=/out/config.yaml
  -v ~/livekit-egress:/out
  livekit/egress  进行房间流的转推//定义后台接收视频进行存储的操作 func preservationVideo(RoomName string) { 	ctx := context.Background() 	egressClient := lksdk.NewEgressClient( 		"https://域名", 		"apk", 		"apiSecret", 	) 	streamRequest := &livekit.RoomCompositeEgressRequest{ 		RoomName: RoomName, 		Layout:   "speaker-dark", 		Output: &livekit.RoomCompositeEgressRequest_Stream{ 			Stream: &livekit.StreamOutput{ 				Protocol: livekit.StreamProtocol_RTMP, 				Urls:     []string{"rtmp://推流地址:20001/live/489ECAC3"}, 			}, 		}, 	} 	egress, err := egressClient.StartRoomCompositeEgress(ctx, streamRequest) 	fmt.Printf("错误是====>:%s ", err) 	fmt.Printf("信息是====>:%s ", egress) } 有问题:欢迎关注公众号[shrkPH]

文案最近很火的情感文案1。人生的出场顺序很重要,不是你不够好,而是你来的不够巧。网易云热评2。每当有人问起为什么我不恋爱的时候,我都以麻烦为由搪塞过去。又有人开始问我到底喜欢过谁没有,我也轻描淡写地表示黄瓜不要凉拌了,加1块五花肉,这样吃才叫过瘾,营养下饭又解馋三餐美味,四季幸福,大家好!黄瓜是一种果蔬两用的食物,它口感清甜,生吃和熟吃都很美味。今天,我要教大家用黄瓜搭配猪肉做个美味佳肴,跟着我做出的菜,吃起来清脆营养又解馋,保管你下两碗秋天,多吃蒸菜身体好!分享5道家常蒸菜,清淡少油,好吃不上火秋天天气干燥,人特别容易上火,饮食上尽量以清淡为主,多吃点水果蔬菜,少吃辛辣油腻之物,就连平时做饭也最好采用清蒸清炒的方式,对身体好。秋燥吃啥好,蒸菜解烦恼!少油少盐还不用闻油烟的中秋将至,推荐这10道家常菜,荤素搭配,好看又好吃,太解馋了大家好,欢迎大家来到我的美食自媒体,我是美食领域创作者锦绣V山东专注美食,让生活更有味。今天为大家带来了几道家常美食的做法,这几道美食也是深受大家的喜欢,而且是很常见的几道美食。天白蘑菇的做法,白蘑菇怎么做好吃白蘑菇生活中特别受欢迎的一种菌类食材,它肉质细嫩,营养丰富,能滋补强壮身体,而且可塑性特别强,可做成多种味道不同的美食,想知道白蘑菇怎么做好吃,可参考下面对白蘑菇做法的具体介绍,能越吃越香的几道家常菜,色香味俱全,做法简单干煸豆角土豆主料土豆2个,豆角250辅料油适量,盐适量,蒜适量,宴友食用油干辣椒适量,葱适量,味精适量具体步骤1。土豆去皮豆角去丝,洗净2。葱蒜,干辣椒切碎,土豆切片,豆角对折3。猪肝好吃有诀窍,很多人第一步就错了,大厨教你正确做法,超解馋生活没有彩排,美食没有美颜。大家好,今天用猪肝给大家分享一道美食。猪肝是指猪体内的一种器官,里面含有了丰富的营养物质,而且适当的吃猪肝对我们人体有好处。而且一头猪仅仅就只有一个猪肝秋季吃鱼,内行人专挑这5种!顺应时节,鲜嫩肥美,好吃又实惠秋天是吃鱼的好季节,无论是淡水鱼还是海鱼,在秋季都是最肥美的时候,此时的鱼会不断觅食储备能量,准备度过寒冬。。因此,秋天的鱼不仅好吃,营养还高,最适合上年纪的人和体弱虚寒者滋补身体梅菜扣肉原料五花肉500克,梅干菜100克调料柱侯酱30克,生抽15克,蚝油10克,红腐乳半块,白糖10克,黄酒10克,盐老抽葱姜各适量做法1葱切段姜切片。梅干菜用冷水浸泡一会儿,洗一遍后家常小菜,百吃而不腻简单又好做一红烧茄子食材长茄子五花肉(适量)辣椒,蒜,油(适量),酱油,糖,酒,油,盐,鸡粉,汤生粉,八角,葱,蒜,香菜,豆瓣,淀粉(芡汁)。制作方法1把茄子洗净去掉头尾,切成滚刀状,泡在清最美之冀共话最美家乡趁着太阳下班,一起步入正定醉人的夜色里!最美之冀共话最美家乡正定初秋的夜晚时而热闹时而静谧时而浪漫如诗趁着太阳的下班时间一起去感受正定初秋夜的魅力吧在你不曾留意的瞬间古城正定的夜幕已被擦亮灯火如同古城的脉络点燃了深邃的夜
聚餐喝剩下的白酒,能打包带走么?酒友这3类情况不建议带现在都提倡勤俭节约,倡导出去吃饭要光盘,这不光是食物要吃光,其他的饮料也都建议能带回去的就带回去。小编也遇到过这样的情况,但是不是饭菜饮料,而是白酒!每次出去吃饭,白酒都会按多了来包菜不管怎么炒,不要直接下锅炒,教你一招,清脆爽口,不出水饭店的炒包菜为什么这么好吃呢?相信很多朋友都不知道,想要做出饭店的味道还是需要掌握几个小技巧,接下来就跟着我的视频一起来看看是怎么做的吧。一醋溜手撕包菜1首先准备一颗新鲜的包菜,包爸爸,我坚持不住了!抑郁症女儿深夜打来电话萌娃养成记爸爸,我坚持不住了!女儿情绪激动地说道。你想怎么办?我问女儿,女儿不说话,哭声从电话那端传了过来,她说什么我听不清楚,只听到她不停地抽泣。随后,电话被她挂断了。女儿周日上棒棒堂聚会阿纬惊见女儿手被偷牵急喊我是不会答应的!记者郭采萦综合报导艺人阿纬(刘峻纬)从模范棒棒堂出道,虽然团体解散多年,私下仍经常与团员联络,日前他和小煜威廉小杰聚会,也各自带上家庭出席,没想到女儿竟然被小煜的儿子偷牵手,还对女女杀人犯毕丽梅,执行死刑时未中要害,在火葬场的路上突然坐起前言2005年,这是稀松平常的一天,对我们普通人而言,可能无关紧要,但是对毕丽梅来说可是大事,因为这一天正是她被押赴刑场执行死刑的日子,不过在执行死刑时发生了一件怪事。在我国的历史这款洗发水建议脱发人囤!别看名字不起眼,防脱生发功效真的牛!在防脱上我可没少下功夫,每次洗头的时候,水池地板地漏里全都是一网一网的头发,前几年还因为发量少受到了不少嘲笑,所以我才开始防脱养发。在此期间我尝试过各种方法,像侧柏叶洗头生姜擦头皮认怂了,爱奇艺不敢在不要脸的路上狂飙了?近来,某奇艺的操作让人越来越看不懂了,先是对投屏清晰度和会员限制等原因反复扯皮,跟用户你一拳我一腿的比起武来,都说传统武术点到为止,但是某奇艺还想多比划几个回合。现在到网上搜索爱奇马龙骚扰科比妻子全程曝出!瓦妮莎你年纪都可以当我父亲在盐湖城全明星赛结束之后,爵士队传奇前锋卡尔马龙却因为滚石的一篇报道而陷入了争议中,Holmes发文公布了04年马龙骚扰科比妻子瓦妮莎的全过程!众所周知,已故湖人队传奇球员科比妻子木棉花开山海香约全国各地影友纷纷打卡昌江向往的春天,从一朵木棉花出发。在素有中国木棉之乡美称的海南省昌江黎族自治县,万里木棉红是一二月的主色调,如木棉红般充满活力,成为近年来当地绿色可持续高质量发展的主旋律。游客在花海田中国最牛的县级市14个火车站3个高铁站1座机场,200多条河流头条创作挑战赛绵阳头条头条旅游中国最牛的县级市有14个火车站3个高铁站,1座机,还有200多条河流这个最牛县级市,名为江油市。地处四川盆地北部,属绵阳市管辖。面积2719平方公里,大运河畔有边城1986年,我作为中国旅游大全山东编写组成员第一次来到临清,找寻撰写实感,搜集一手资料。虽说那时的临清及所在的聊城地区尚属经济欠发达地区,小城风貌也散发着古旧甚至有些破败的气息,但