字节跳动《实时音视频通讯技术》学习笔记之 RTC 概述及技术简介

什么是实时音视频
实时音视频(RTC)即基于 IP 技术实现的实时交互的音视频通信技术。
RTC 与 直播常用协议的区别
而这里我们要使用的 RTC 技术就厉害了~
它是基于 IP 技术的,它的延迟低于 400ms,RTC 传输的内容是音视频数据。
实时音视频应用场景
音视频通话
产品功能
1V1,多人音视频通话
可以美颜、使用道具等等。
技术特点
支持设备差异性大
网路接入经常切换
因为这种产品主要是面向用户的,不同用户使用的设备的差别比较大。根据不同设备需要做不同的优化。这就是为什么我们说支持设备差异性大。
而在实际情况中,经常遇到移动网络 4G、5G 切换 WIFI,或者基站之间的切换。这些导致网络环境的变化需要中断重连。
下面介绍两种场景:抖音直播和直播连麦。
抖音直播
产品功能Ⅰ
电商直播
游戏直播
秀场直播
技术特点Ⅰ
主播段推流
观众端 CDN 拉流
直播连麦
产品功能Ⅱ
多个主播同框互动,观众围观实况
K 歌、游戏互动、互动交流
技术特点Ⅱ
服务端 &客户端合流
合流转推
实时审核
直播连麦将多个主播的视频流合流然后发送给观众。这种合流一般是在服务端做的,但是现在由于客户端的性能不断提高,现在出现了将合流放在客户端的情况,这样节约了成本。
我们都知道传统直播技术的延迟比较高,从观众评论到看到主播反馈一般要 5-10 秒以上,那么这样在教育直播、电商直播、体育直播等直播就会出现一些问题。
前面我们提到 RTC 能够实现低延迟的实时传输音视频流,那么 RTC 可以应用在直播场景吗?
答案是是,因为只要我们将基于 TCP 的网络传输协议转化为基于 UDP 的 RTC 就行了。
那为什么我们不一开始就使用 RTC 呢?
第一因为成本,CDN 的成本是 RTC 的三分之一,RTC 的部署是比较消耗资源的。
第二是因为 RTC 是需要做很多网络的优化的,比较复杂。
普通直播替换为低延时直播的方案
方案Ⅰ
拉流端(播放端)替换为 RTC:收益大。
因为观众端的延时比较大,所以一般是从观众端替换为 RTC。
方案Ⅱ
推流端(主播端)替换为 RTC:收益中。
因为主播网络环境一般还不错,所以不优先考虑主播端。
RTC 应用场景:在线教育
一对一教育
产品功能
1V1 教学
白板、课件
云端录制
监课
技术特点
课件同步
音视频通话类似
可能需要跨国
要求和音视频通话一样,需要及时反馈,需要低延迟,跨国一对一可能物理距离较远,导致延迟可能较高。
大班课
产品功能
万人课堂
白板、课件
云端录制
监课
技术特点
1 人发布
课件同步
大班课技术难度比 1V1 教育低,因为一般情况下只是老师一个人推流,不存在过多互动。总的来看,大班课互动性较差,学习体验可能不是很好。
于是,小班课就产生了,它有较强的互动性,但是其难度最大,比 1v1 教育难度要高。因为每个人网络环境不一样,需要给不同用户下发不同码率的视频。
小班课
产品功能
多人互动
白板、课件
云端录制
监课
技术特点
多人发布与订阅
课件同步
RTC 使用场景:视频会议
飞书视频会议
产品功能
百(千)人视频互动
屏幕共享
文档分享
PSTN 接入
背景虚化,美颜...
技术特点
多人音视频互动
接入设备多样性
音频降噪
弱网优化
AI 能力
总体来说,视频会议的技术难度较大,对音频降噪的要求比较高,同时存在 PSTN 接入的情况。
RTC 使用场景:游戏
游戏对战
产品功能
小队语音
范围语音
技术特点
低延迟、低耗能、流量小
范围语音
因为游戏比较耗计算机资源和网络资源,又要求低延迟。所以需要达到低延迟、低耗能、流量小。
云游戏
产品功能
游戏运行在服务端
客户端渲染、控制
技术特点
超低延迟
海量控制指令
这样即使设备性能不高也能实现尝试高性能的游戏。适用于大型游戏和游戏试玩。
因为需要良好的游戏体验,就需要超低延迟。而且因为我们 RTC 可以传输海量的控制指令,所以可以用于云游戏。
实时音视频技术概览
RTC 系统架构图
信令是一些控制指令,信令服务器可以用于呼叫、协调。
合流转推等等这些操作是后处理服务器来完成的。
客户端是音视频通话的终端,我们来看看客户端整体技术架构。
QoS 是保证在弱网的情况下仍然能够使用。
事件上报是因为任何的日志都需要上传,可以处理错误和进行性能优化、算法改进。
全平台支持
设备适配
性能适配
连接保持
断网重连
多径传输
数据运营
事件上报
日志收集
低性能的设备使用低性能的算法。
同时支持 WIFI、4G 就需要实现多径传输。
采集到音视频等数据需要进行编码压缩然后通过网络传输,然后解码播放。
信令服务器
信令:为使网络中各种设备协调运作,在设备之间传递的控制信息。
信令服务器:就是用来传输、中专信令的服务器。
常见问题
全球化部署
信令到达率
连接保持
实现方案
WebSocket
自定义协议
媒体服务器
媒体服务器:在终端用户之间中转音视频流,进而让用户之间可以进行音视频通信。通常部署在边缘,距离用户较近的地方。
Simulcast&SVC 是根据不同用户的网络状况提供不同码率、帧率的视频。
BWE&拥塞控制是用来估计用户的可用带宽,来判断给用户发送多大码率的码流。
下面来看看几种媒体服务器的典型架构:
后处理
音视频录制
合流转推
截图、切片
审核
还有什么?
数据运营
质量评估
QoS
自动化测试
应用场景探索
需要数据才能优化,视频是否清晰,音频是否悦耳这就需要质量评估。
https://github.com/0qbhb7d2-debug/tdyg/issues/823
https://github.com/0qbhb7d2-debug/tdyg/issues/822
https://github.com/0qbhb7d2-debug/tdyg/issues/821
https://github.com/0qbhb7d2-debug/tdyg/issues/820
https://github.com/0qbhb7d2-debug/tdyg/issues/819
https://github.com/0qbhb7d2-debug/tdyg/issues/818
https://github.com/0qbhb7d2-debug/tdyg/issues/817
https://github.com/0qbhb7d2-debug/tdyg/issues/816
https://github.com/0qbhb7d2-debug/tdyg/issues/815
https://github.com/0qbhb7d2-debug/tdyg/issues/814
https://github.com/0qbhb7d2-debug/tdyg/issues/813
https://github.com/0qbhb7d2-debug/tdyg/issues/812
https://github.com/0qbhb7d2-debug/tdyg/issues/811
https://github.com/0qbhb7d2-debug/tdyg/issues/810
https://github.com/0qbhb7d2-debug/tdyg/issues/809
https://github.com/0qbhb7d2-debug/tdyg/issues/808
https://github.com/0qbhb7d2-debug/tdyg/issues/807
https://github.com/0qbhb7d2-debug/tdyg/issues/806
https://github.com/0qbhb7d2-debug/tdyg/issues/805
https://github.com/0qbhb7d2-debug/tdyg/issues/804
https://github.com/0qbhb7d2-debug/tdyg/issues/803
https://github.com/0qbhb7d2-debug/tdyg/issues/802
https://github.com/0qbhb7d2-debug/tdyg/issues/801
https://github.com/0qbhb7d2-debug/tdyg/issues/800
https://github.com/0qbhb7d2-debug/tdyg/issues/799
https://github.com/0qbhb7d2-debug/tdyg/issues/798
https://github.com/0qbhb7d2-debug/tdyg/issues/797
https://github.com/0qbhb7d2-debug/tdyg/issues/796
https://github.com/0qbhb7d2-debug/tdyg/issues/795
https://github.com/0qbhb7d2-debug/tdyg/issues/794
https://github.com/0qbhb7d2-debug/tdyg/issues/793
https://github.com/0qbhb7d2-debug/tdyg/issues/792
https://github.com/0qbhb7d2-debug/tdyg/issues/791
https://github.com/0qbhb7d2-debug/tdyg/issues/790
https://github.com/0qbhb7d2-debug/tdyg/issues/789
https://github.com/0qbhb7d2-debug/tdyg/issues/788
https://github.com/0qbhb7d2-debug/tdyg/issues/787
https://github.com/0qbhb7d2-debug/tdyg/issues/786
https://github.com/0qbhb7d2-debug/tdyg/issues/785
https://github.com/0qbhb7d2-debug/tdyg/issues/784
https://github.com/0qbhb7d2-debug/tdyg/issues/783
https://github.com/0qbhb7d2-debug/tdyg/issues/782
https://github.com/0qbhb7d2-debug/tdyg/issues/781
https://github.com/0qbhb7d2-debug/tdyg/issues/780
https://github.com/0qbhb7d2-debug/tdyg/issues/779
https://github.com/0qbhb7d2-debug/tdyg/issues/778
https://github.com/0qbhb7d2-debug/tdyg/issues/777
https://github.com/0qbhb7d2-debug/tdyg/issues/776
https://github.com/0qbhb7d2-debug/tdyg/issues/775
https://github.com/0qbhb7d2-debug/tdyg/issues/774
https://github.com/0qbhb7d2-debug/tdyg/issues/773
https://github.com/0qbhb7d2-debug/tdyg/issues/772
https://github.com/0qbhb7d2-debug/tdyg/issues/771
https://github.com/0qbhb7d2-debug/tdyg/issues/770
https://github.com/0qbhb7d2-debug/tdyg/issues/769
https://github.com/0qbhb7d2-debug/tdyg/issues/768
https://github.com/0qbhb7d2-debug/tdyg/issues/767
https://github.com/0qbhb7d2-debug/tdyg/issues/766
https://github.com/0qbhb7d2-debug/tdyg/issues/765
https://github.com/0qbhb7d2-debug/tdyg/issues/764
https://github.com/0qbhb7d2-debug/tdyg/issues/763
https://github.com/0qbhb7d2-debug/tdyg/issues/762
https://github.com/0qbhb7d2-debug/tdyg/issues/761
https://github.com/0qbhb7d2-debug/tdyg/issues/760
https://github.com/0qbhb7d2-debug/tdyg/issues/759
https://github.com/0qbhb7d2-debug/tdyg/issues/758
https://github.com/0qbhb7d2-debug/tdyg/issues/757
https://github.com/0qbhb7d2-debug/tdyg/issues/756
https://github.com/0qbhb7d2-debug/tdyg/issues/755
https://github.com/0qbhb7d2-debug/tdyg/issues/754
https://github.com/0qbhb7d2-debug/tdyg/issues/753
https://github.com/0qbhb7d2-debug/tdyg/issues/752
https://github.com/0qbhb7d2-debug/tdyg/issues/751
https://github.com/0qbhb7d2-debug/tdyg/issues/750
https://github.com/0qbhb7d2-debug/tdyg/issues/749
https://github.com/0qbhb7d2-debug/tdyg/issues/748
https://github.com/0qbhb7d2-debug/tdyg/issues/747
https://github.com/0qbhb7d2-debug/tdyg/issues/746
https://github.com/0qbhb7d2-debug/tdyg/issues/745
https://github.com/0qbhb7d2-debug/tdyg/issues/744
https://github.com/0qbhb7d2-debug/tdyg/issues/743
https://github.com/0qbhb7d2-debug/tdyg/issues/742
https://github.com/0qbhb7d2-debug/tdyg/issues/741
https://github.com/0qbhb7d2-debug/tdyg/issues/740
https://github.com/0qbhb7d2-debug/tdyg/issues/739
https://github.com/0qbhb7d2-debug/tdyg/issues/738
https://github.com/0qbhb7d2-debug/tdyg/issues/737
https://github.com/0qbhb7d2-debug/tdyg/issues/736
https://github.com/0qbhb7d2-debug/tdyg/issues/735
https://github.com/0qbhb7d2-debug/tdyg/issues/734
https://github.com/0qbhb7d2-debug/tdyg/issues/733
https://github.com/0qbhb7d2-debug/tdyg/issues/732
https://github.com/0qbhb7d2-debug/tdyg/issues/731
https://github.com/0qbhb7d2-debug/tdyg/issues/730
https://github.com/0qbhb7d2-debug/tdyg/issues/729
https://github.com/0qbhb7d2-debug/tdyg/issues/728
https://github.com/0qbhb7d2-debug/tdyg/issues/727
https://github.com/0qbhb7d2-debug/tdyg/issues/726
https://github.com/0qbhb7d2-debug/tdyg/issues/725
https://github.com/0qbhb7d2-debug/tdyg/issues/724
https://github.com/0qbhb7d2-debug/tdyg/issues/723
https://github.com/0qbhb7d2-debug/tdyg/issues/722
https://github.com/0qbhb7d2-debug/tdyg/issues/721
https://github.com/0qbhb7d2-debug/tdyg/issues/720
https://github.com/0qbhb7d2-debug/tdyg/issues/719
https://github.com/0qbhb7d2-debug/tdyg/issues/718
https://github.com/0qbhb7d2-debug/tdyg/issues/717
https://github.com/0qbhb7d2-debug/tdyg/issues/716
https://github.com/0qbhb7d2-debug/tdyg/issues/715
https://github.com/0qbhb7d2-debug/tdyg/issues/714
https://github.com/0qbhb7d2-debug/tdyg/issues/713
https://github.com/0qbhb7d2-debug/tdyg/issues/712
https://github.com/0qbhb7d2-debug/tdyg/issues/711
https://github.com/0qbhb7d2-debug/tdyg/issues/710
https://github.com/0qbhb7d2-debug/tdyg/issues/709
https://github.com/0qbhb7d2-debug/tdyg/issues/708
https://github.com/0qbhb7d2-debug/tdyg/issues/707
https://github.com/0qbhb7d2-debug/tdyg/issues/706
https://github.com/0qbhb7d2-debug/tdyg/issues/705
https://github.com/0qbhb7d2-debug/tdyg/issues/704
https://github.com/0qbhb7d2-debug/tdyg/issues/703
https://github.com/0qbhb7d2-debug/tdyg/issues/702
https://github.com/0qbhb7d2-debug/tdyg/issues/701
https://github.com/0qbhb7d2-debug/tdyg/issues/700
https://github.com/0qbhb7d2-debug/tdyg/issues/699
https://github.com/0qbhb7d2-debug/tdyg/issues/698
https://github.com/0qbhb7d2-debug/tdyg/issues/697
https://github.com/0qbhb7d2-debug/tdyg/issues/696
https://github.com/0qbhb7d2-debug/tdyg/issues/695
https://github.com/0qbhb7d2-debug/tdyg/issues/694
https://github.com/0qbhb7d2-debug/tdyg/issues/693
https://github.com/0qbhb7d2-debug/tdyg/issues/692
https://github.com/0qbhb7d2-debug/tdyg/issues/691
https://github.com/0qbhb7d2-debug/tdyg/issues/690
https://github.com/0qbhb7d2-debug/tdyg/issues/689
https://github.com/0qbhb7d2-debug/tdyg/issues/688
https://github.com/0qbhb7d2-debug/tdyg/issues/687
https://github.com/0qbhb7d2-debug/tdyg/issues/686
https://github.com/0qbhb7d2-debug/tdyg/issues/685
https://github.com/0qbhb7d2-debug/tdyg/issues/684
https://github.com/0qbhb7d2-debug/tdyg/issues/683
https://github.com/0qbhb7d2-debug/tdyg/issues/682
https://github.com/0qbhb7d2-debug/tdyg/issues/681
https://github.com/0qbhb7d2-debug/tdyg/issues/680
https://github.com/0qbhb7d2-debug/tdyg/issues/679
https://github.com/0qbhb7d2-debug/tdyg/issues/678
https://github.com/0qbhb7d2-debug/tdyg/issues/677
https://github.com/0qbhb7d2-debug/tdyg/issues/676
https://github.com/0qbhb7d2-debug/tdyg/issues/675
https://github.com/0qbhb7d2-debug/tdyg/issues/674
https://github.com/0qbhb7d2-debug/tdyg/issues/673
https://github.com/0qbhb7d2-debug/tdyg/issues/672
https://github.com/0qbhb7d2-debug/tdyg/issues/671
https://github.com/0qbhb7d2-debug/tdyg/issues/670
https://github.com/0qbhb7d2-debug/tdyg/issues/669
https://github.com/0qbhb7d2-debug/tdyg/issues/668
https://github.com/0qbhb7d2-debug/tdyg/issues/667
https://github.com/0qbhb7d2-debug/tdyg/issues/666
https://github.com/0qbhb7d2-debug/tdyg/issues/665
https://github.com/0qbhb7d2-debug/tdyg/issues/664
https://github.com/0qbhb7d2-debug/tdyg/issues/663
https://github.com/0qbhb7d2-debug/tdyg/issues/662
https://github.com/0qbhb7d2-debug/tdyg/issues/661
https://github.com/0qbhb7d2-debug/tdyg/issues/660
https://github.com/0qbhb7d2-debug/tdyg/issues/659
https://github.com/0qbhb7d2-debug/tdyg/issues/658
https://github.com/0qbhb7d2-debug/tdyg/issues/657
https://github.com/0qbhb7d2-debug/tdyg/issues/656
https://github.com/0qbhb7d2-debug/tdyg/issues/655
https://github.com/0qbhb7d2-debug/tdyg/issues/654
https://github.com/0qbhb7d2-debug/tdyg/issues/653
https://github.com/0qbhb7d2-debug/tdyg/issues/652
https://github.com/0qbhb7d2-debug/tdyg/issues/651
https://github.com/0qbhb7d2-debug/tdyg/issues/650
https://github.com/0qbhb7d2-debug/tdyg/issues/649
https://github.com/0qbhb7d2-debug/tdyg/issues/648
https://github.com/0qbhb7d2-debug/tdyg/issues/647
https://github.com/0qbhb7d2-debug/tdyg/issues/646
https://github.com/0qbhb7d2-debug/tdyg/issues/645
https://github.com/0qbhb7d2-debug/tdyg/issues/644
https://github.com/0qbhb7d2-debug/tdyg/issues/643
https://github.com/0qbhb7d2-debug/tdyg/issues/642
https://github.com/0qbhb7d2-debug/tdyg/issues/641
https://github.com/0qbhb7d2-debug/tdyg/issues/640
https://github.com/0qbhb7d2-debug/tdyg/issues/639
https://github.com/0qbhb7d2-debug/tdyg/issues/638
https://github.com/0qbhb7d2-debug/tdyg/issues/637
https://github.com/0qbhb7d2-debug/tdyg/issues/636
https://github.com/0qbhb7d2-debug/tdyg/issues/635
https://github.com/0qbhb7d2-debug/tdyg/issues/634
https://github.com/0qbhb7d2-debug/tdyg/issues/633
https://github.com/0qbhb7d2-debug/tdyg/issues/632
https://github.com/0qbhb7d2-debug/tdyg/issues/631
https://github.com/0qbhb7d2-debug/tdyg/issues/630
https://github.com/0qbhb7d2-debug/tdyg/issues/629
https://github.com/0qbhb7d2-debug/tdyg/issues/628
https://github.com/0qbhb7d2-debug/tdyg/issues/627
https://github.com/0qbhb7d2-debug/tdyg/issues/626
https://github.com/0qbhb7d2-debug/tdyg/issues/625
https://github.com/0qbhb7d2-debug/tdyg/issues/624
https://github.com/0qbhb7d2-debug/tdyg/issues/623
https://github.com/0qbhb7d2-debug/tdyg/issues/622
https://github.com/0qbhb7d2-debug/tdyg/issues/621
https://github.com/0qbhb7d2-debug/tdyg/issues/620
https://github.com/0qbhb7d2-debug/tdyg/issues/619
https://github.com/0qbhb7d2-debug/tdyg/issues/618
https://github.com/0qbhb7d2-debug/tdyg/issues/617
https://github.com/0qbhb7d2-debug/tdyg/issues/616
https://github.com/0qbhb7d2-debug/tdyg/issues/615
https://github.com/0qbhb7d2-debug/tdyg/issues/614
https://github.com/0qbhb7d2-debug/tdyg/issues/613
https://github.com/0qbhb7d2-debug/tdyg/issues/612
https://github.com/0qbhb7d2-debug/tdyg/issues/611
https://github.com/0qbhb7d2-debug/tdyg/issues/610
https://github.com/0qbhb7d2-debug/tdyg/issues/609
https://github.com/0qbhb7d2-debug/tdyg/issues/608
https://github.com/0qbhb7d2-debug/tdyg/issues/607
https://github.com/0qbhb7d2-debug/tdyg/issues/606
https://github.com/0qbhb7d2-debug/tdyg/issues/605
https://github.com/0qbhb7d2-debug/tdyg/issues/604
https://github.com/0qbhb7d2-debug/tdyg/issues/603
https://github.com/0qbhb7d2-debug/tdyg/issues/602
https://github.com/0qbhb7d2-debug/tdyg/issues/601
https://github.com/0qbhb7d2-debug/tdyg/issues/600
https://github.com/0qbhb7d2-debug/tdyg/issues/599
https://github.com/0qbhb7d2-debug/tdyg/issues/598
https://github.com/0qbhb7d2-debug/tdyg/issues/597
https://github.com/0qbhb7d2-debug/tdyg/issues/596
https://github.com/0qbhb7d2-debug/tdyg/issues/595
https://github.com/0qbhb7d2-debug/tdyg/issues/594
https://github.com/0qbhb7d2-debug/tdyg/issues/593
https://github.com/0qbhb7d2-debug/tdyg/issues/592
https://github.com/0qbhb7d2-debug/tdyg/issues/591
https://github.com/0qbhb7d2-debug/tdyg/issues/590
https://github.com/0qbhb7d2-debug/tdyg/issues/589
https://github.com/0qbhb7d2-debug/tdyg/issues/588
https://github.com/0qbhb7d2-debug/tdyg/issues/587
https://github.com/0qbhb7d2-debug/tdyg/issues/586
https://github.com/0qbhb7d2-debug/tdyg/issues/585
https://github.com/0qbhb7d2-debug/tdyg/issues/584
https://github.com/0qbhb7d2-debug/tdyg/issues/583
https://github.com/0qbhb7d2-debug/tdyg/issues/582
https://github.com/0qbhb7d2-debug/tdyg/issues/581
https://github.com/0qbhb7d2-debug/tdyg/issues/580
https://github.com/0qbhb7d2-debug/tdyg/issues/579
https://github.com/0qbhb7d2-debug/tdyg/issues/578
https://github.com/0qbhb7d2-debug/tdyg/issues/577
https://github.com/0qbhb7d2-debug/tdyg/issues/576
https://github.com/0qbhb7d2-debug/tdyg/issues/575
https://github.com/0qbhb7d2-debug/tdyg/issues/574
https://github.com/0qbhb7d2-debug/tdyg/issues/573
https://github.com/0qbhb7d2-debug/tdyg/issues/572
https://github.com/0qbhb7d2-debug/tdyg/issues/571
https://github.com/0qbhb7d2-debug/tdyg/issues/570
https://github.com/0qbhb7d2-debug/tdyg/issues/569
https://github.com/0qbhb7d2-debug/tdyg/issues/568
https://github.com/0qbhb7d2-debug/tdyg/issues/567
https://github.com/0qbhb7d2-debug/tdyg/issues/566
https://github.com/0qbhb7d2-debug/tdyg/issues/565
https://github.com/0qbhb7d2-debug/tdyg/issues/564
https://github.com/0qbhb7d2-debug/tdyg/issues/563
https://github.com/0qbhb7d2-debug/tdyg/issues/562
https://github.com/0qbhb7d2-debug/tdyg/issues/561
https://github.com/0qbhb7d2-debug/tdyg/issues/560
https://github.com/0qbhb7d2-debug/tdyg/issues/559
https://github.com/0qbhb7d2-debug/tdyg/issues/558
https://github.com/0qbhb7d2-debug/tdyg/issues/557
https://github.com/0qbhb7d2-debug/tdyg/issues/556
https://github.com/0qbhb7d2-debug/tdyg/issues/555
https://github.com/0qbhb7d2-debug/tdyg/issues/554
https://github.com/0qbhb7d2-debug/tdyg/issues/553
https://github.com/0qbhb7d2-debug/tdyg/issues/552
https://github.com/0qbhb7d2-debug/tdyg/issues/551
https://github.com/0qbhb7d2-debug/tdyg/issues/550
https://github.com/0qbhb7d2-debug/tdyg/issues/549
https://github.com/0qbhb7d2-debug/tdyg/issues/548
https://github.com/0qbhb7d2-debug/tdyg/issues/547
https://github.com/0qbhb7d2-debug/tdyg/issues/546
https://github.com/0qbhb7d2-debug/tdyg/issues/545
https://github.com/0qbhb7d2-debug/tdyg/issues/544
https://github.com/0qbhb7d2-debug/tdyg/issues/543
https://github.com/0qbhb7d2-debug/tdyg/issues/542
https://github.com/0qbhb7d2-debug/tdyg/issues/541
https://github.com/0qbhb7d2-debug/tdyg/issues/540
https://github.com/0qbhb7d2-debug/tdyg/issues/539
https://github.com/0qbhb7d2-debug/tdyg/issues/538
https://github.com/0qbhb7d2-debug/tdyg/issues/537
https://github.com/0qbhb7d2-debug/tdyg/issues/536
https://github.com/0qbhb7d2-debug/tdyg/issues/535
https://github.com/0qbhb7d2-debug/tdyg/issues/534
https://github.com/0qbhb7d2-debug/tdyg/issues/533
https://github.com/0qbhb7d2-debug/tdyg/issues/532
https://github.com/0qbhb7d2-debug/tdyg/issues/531
https://github.com/0qbhb7d2-debug/tdyg/issues/530
https://github.com/0qbhb7d2-debug/tdyg/issues/529
https://github.com/0qbhb7d2-debug/tdyg/issues/528
https://github.com/0qbhb7d2-debug/tdyg/issues/527
https://github.com/0qbhb7d2-debug/tdyg/issues/526
https://github.com/0qbhb7d2-debug/tdyg/issues/525
https://github.com/0qbhb7d2-debug/tdyg/issues/524
https://github.com/0qbhb7d2-debug/tdyg/issues/523
https://github.com/0qbhb7d2-debug/tdyg/issues/522
https://github.com/0qbhb7d2-debug/tdyg/issues/521
https://github.com/0qbhb7d2-debug/tdyg/issues/520
https://github.com/0qbhb7d2-debug/tdyg/issues/519
https://github.com/0qbhb7d2-debug/tdyg/issues/518
https://github.com/0qbhb7d2-debug/tdyg/issues/517
https://github.com/0qbhb7d2-debug/tdyg/issues/516
https://github.com/0qbhb7d2-debug/tdyg/issues/515
https://github.com/0qbhb7d2-debug/tdyg/issues/514
https://github.com/0qbhb7d2-debug/tdyg/issues/513
https://github.com/0qbhb7d2-debug/tdyg/issues/512
https://github.com/0qbhb7d2-debug/tdyg/issues/511
https://github.com/0qbhb7d2-debug/tdyg/issues/510
https://github.com/0qbhb7d2-debug/tdyg/issues/509
https://github.com/0qbhb7d2-debug/tdyg/issues/508
https://github.com/0qbhb7d2-debug/tdyg/issues/507
https://github.com/0qbhb7d2-debug/tdyg/issues/506
https://github.com/0qbhb7d2-debug/tdyg/issues/505
https://github.com/0qbhb7d2-debug/tdyg/issues/504
https://github.com/0qbhb7d2-debug/tdyg/issues/503
https://github.com/0qbhb7d2-debug/tdyg/issues/502
https://github.com/0qbhb7d2-debug/tdyg/issues/501
https://github.com/0qbhb7d2-debug/tdyg/issues/500
https://github.com/0qbhb7d2-debug/tdyg/issues/499
https://github.com/0qbhb7d2-debug/tdyg/issues/498
https://github.com/0qbhb7d2-debug/tdyg/issues/497
https://github.com/0qbhb7d2-debug/tdyg/issues/496
https://github.com/0qbhb7d2-debug/tdyg/issues/495
https://github.com/0qbhb7d2-debug/tdyg/issues/494
https://github.com/0qbhb7d2-debug/tdyg/issues/493
https://github.com/0qbhb7d2-debug/tdyg/issues/492
https://github.com/0qbhb7d2-debug/tdyg/issues/491
https://github.com/0qbhb7d2-debug/tdyg/issues/490
https://github.com/0qbhb7d2-debug/tdyg/issues/489
https://github.com/0qbhb7d2-debug/tdyg/issues/488
https://github.com/0qbhb7d2-debug/tdyg/issues/487
https://github.com/0qbhb7d2-debug/tdyg/issues/486
https://github.com/0qbhb7d2-debug/tdyg/issues/485
https://github.com/0qbhb7d2-debug/tdyg/issues/484
https://github.com/0qbhb7d2-debug/tdyg/issues/483
https://github.com/0qbhb7d2-debug/tdyg/issues/482
https://github.com/0qbhb7d2-debug/tdyg/issues/481
https://github.com/0qbhb7d2-debug/tdyg/issues/480
https://github.com/0qbhb7d2-debug/tdyg/issues/479
https://github.com/0qbhb7d2-debug/tdyg/issues/478
https://github.com/0qbhb7d2-debug/tdyg/issues/477
https://github.com/0qbhb7d2-debug/tdyg/issues/476
https://github.com/0qbhb7d2-debug/tdyg/issues/475
https://github.com/0qbhb7d2-debug/tdyg/issues/474
https://github.com/0qbhb7d2-debug/tdyg/issues/473
https://github.com/0qbhb7d2-debug/tdyg/issues/472
https://github.com/0qbhb7d2-debug/tdyg/issues/471
https://github.com/0qbhb7d2-debug/tdyg/issues/470
https://github.com/0qbhb7d2-debug/tdyg/issues/469
https://github.com/0qbhb7d2-debug/tdyg/issues/468
https://github.com/0qbhb7d2-debug/tdyg/issues/467
https://github.com/0qbhb7d2-debug/tdyg/issues/466
https://github.com/0qbhb7d2-debug/tdyg/issues/465
https://github.com/0qbhb7d2-debug/tdyg/issues/464
https://github.com/0qbhb7d2-debug/tdyg/issues/463
https://github.com/0qbhb7d2-debug/tdyg/issues/462
https://github.com/0qbhb7d2-debug/tdyg/issues/461
https://github.com/0qbhb7d2-debug/tdyg/issues/460
https://github.com/0qbhb7d2-debug/tdyg/issues/459
https://github.com/0qbhb7d2-debug/tdyg/issues/458
https://github.com/0qbhb7d2-debug/tdyg/issues/457
https://github.com/0qbhb7d2-debug/tdyg/issues/456
https://github.com/0qbhb7d2-debug/tdyg/issues/455
https://github.com/0qbhb7d2-debug/tdyg/issues/454
https://github.com/0qbhb7d2-debug/tdyg/issues/453
https://github.com/0qbhb7d2-debug/tdyg/issues/452
https://github.com/0qbhb7d2-debug/tdyg/issues/451
https://github.com/0qbhb7d2-debug/tdyg/issues/450
https://github.com/0qbhb7d2-debug/tdyg/issues/449
https://github.com/0qbhb7d2-debug/tdyg/issues/448
https://github.com/0qbhb7d2-debug/tdyg/issues/447
https://github.com/0qbhb7d2-debug/tdyg/issues/446
https://github.com/0qbhb7d2-debug/tdyg/issues/445
https://github.com/0qbhb7d2-debug/tdyg/issues/444
https://github.com/0qbhb7d2-debug/tdyg/issues/443
https://github.com/0qbhb7d2-debug/tdyg/issues/442
https://github.com/0qbhb7d2-debug/tdyg/issues/441
https://github.com/0qbhb7d2-debug/tdyg/issues/440
https://github.com/0qbhb7d2-debug/tdyg/issues/439
https://github.com/0qbhb7d2-debug/tdyg/issues/438
https://github.com/0qbhb7d2-debug/tdyg/issues/437
https://github.com/0qbhb7d2-debug/tdyg/issues/436
https://github.com/0qbhb7d2-debug/tdyg/issues/435
https://github.com/0qbhb7d2-debug/tdyg/issues/434
https://github.com/0qbhb7d2-debug/tdyg/issues/433
https://github.com/0qbhb7d2-debug/tdyg/issues/432
https://github.com/0qbhb7d2-debug/tdyg/issues/431
https://github.com/0qbhb7d2-debug/tdyg/issues/430
https://github.com/0qbhb7d2-debug/tdyg/issues/429
https://github.com/0qbhb7d2-debug/tdyg/issues/428
https://github.com/0qbhb7d2-debug/tdyg/issues/427
https://github.com/0qbhb7d2-debug/tdyg/issues/426
https://github.com/0qbhb7d2-debug/tdyg/issues/425
https://github.com/0qbhb7d2-debug/tdyg/issues/424
https://github.com/0qbhb7d2-debug/tdyg/issues/423
https://github.com/0qbhb7d2-debug/tdyg/issues/422
https://github.com/0qbhb7d2-debug/tdyg/issues/421
https://github.com/0qbhb7d2-debug/tdyg/issues/420
https://github.com/0qbhb7d2-debug/tdyg/issues/419
https://github.com/0qbhb7d2-debug/tdyg/issues/418
https://github.com/0qbhb7d2-debug/tdyg/issues/417
https://github.com/0qbhb7d2-debug/tdyg/issues/416
https://github.com/0qbhb7d2-debug/tdyg/issues/415
https://github.com/0qbhb7d2-debug/tdyg/issues/414
https://github.com/0qbhb7d2-debug/tdyg/issues/413
https://github.com/0qbhb7d2-debug/tdyg/issues/412
https://github.com/0qbhb7d2-debug/tdyg/issues/411
https://github.com/0qbhb7d2-debug/tdyg/issues/410
https://github.com/0qbhb7d2-debug/tdyg/issues/409
https://github.com/0qbhb7d2-debug/tdyg/issues/408
https://github.com/0qbhb7d2-debug/tdyg/issues/407
https://github.com/0qbhb7d2-debug/tdyg/issues/406
https://github.com/0qbhb7d2-debug/tdyg/issues/405
https://github.com/0qbhb7d2-debug/tdyg/issues/404
https://github.com/0qbhb7d2-debug/tdyg/issues/403
https://github.com/0qbhb7d2-debug/tdyg/issues/402
https://github.com/0qbhb7d2-debug/tdyg/issues/401
https://github.com/0qbhb7d2-debug/tdyg/issues/400
https://github.com/0qbhb7d2-debug/tdyg/issues/399
https://github.com/0qbhb7d2-debug/tdyg/issues/398
https://github.com/0qbhb7d2-debug/tdyg/issues/397
https://github.com/0qbhb7d2-debug/tdyg/issues/396
自动化测试和质量评估也是比较重要的。
去探索新的应用场景也是非常重要的。







评论