WebRTC 如何知道 RTX Stream 的 SSRC

Overview 每个流都有一个配置 struct StreamConfig { StreamConfig(); StreamConfig(const StreamConfig& other); ~StreamConfig(); bool operator==(const StreamConfig& other) const; bool operator!=(const StreamConfig& other) const; uint32_t local_ssrc = 0; uint32_t remote_ssrc = 0; uint32_t rtx_ssrc = 0; std::string rsid; bool remb = false; std::vector<RtpExtension> rtp_extensions; RtcpMode rtcp_mode = RtcpMode::kReducedSize; struct Codec { Codec(absl::string_view payload_name, int payload_type, int rtx_payload_type); bool operator==(const […] →Read more

监控模式

USE Utilization 利用率 Saturation 饱和度 Error 错误率 RED Rate 每秒接收的请求数 Error 每秒失败的请求数 Duration 每个请求的耗时 Gold metrics Latency 处理请求所需的时间 Traffic 处理请求所需的流量 Error 请求的错误率 Saturation 服务的资源使用情况 →Read more

无处不在的发布订阅模式(TBD)

订阅一份报纸,到时候就会投递给你。 订阅一个新闻频道,一有新闻就会推送给你。 本质上,它是一种异步通信的架构模式 与之对应的代码模式就是观察者模式,其注册 register 对应于 subscribe, notify 对应于 publishe subscribe subscriber -> router: subscribe router–>subscriber: ack publisher publisher -> router: event router–>publisher: ack router –> subscriber: event subscviber–>router: ack 典型用例有 Ingestion user interaction and server events. To use user interaction events from end-user apps or server events from your system, you might forward them […] →Read more

拒绝摆烂

这个世界再烂,也拒绝摆烂,写书,写代码,写评论,我写故我在。 与朋友去交流,跑步,打球,让自己流汗,不让自己流泪。 →Read more

WebRTC RTX

在 WebRTC 中常用的 QoS 策略有 反馈:例如 PLI , NACK 冗余, 例如 FEC, RTX 调整:例如码率,分辨率及帧率的调整 缓存: 例如 Receive Adaptive Jitter Buffer, Send Buffer 这些措施的采用需要基于拥塞控制(congestion control) 及带宽估计(bandwidth estimation)技术, 不同的网络条件下需要采用不同的措施。 Webrtc 默认是开启 RTX (重传),它一般采用不同的 SSRC 进行传输 RTX 包的 Payload 在 RFC4588 中有详细描述,一般 NACK 和 Bandwidth Probe 也可能走 RTX 通道。 FEC 用作丢包恢复需要占用更多的带宽,即使 5% 的丢包需要几乎一倍的带宽,在带宽有限的情况下可能会使情况更糟。 RTX 不会占用太多的带宽,接收方发送 NACK 指明哪些包丢失了,发送方通过单独的 RTP […] →Read more

C++ 程序 Crash 的分析

1) 是否容易重现 如果容易,它的复现步骤是什么 如果不容易,它在什么条件下的出现机率比较大,有没有可能缩小排查的范围 2) 是否最近才引入的,发现的时机和频率如何 找出 crash 出现的时间范围,时机,和频率 根据 backgrace 和 git log, 回顾 crash 相关代码的修改记录 3) 灵活运用演绎法,归纳法和二分法 演绎法: 从一般到特殊,从常见的 crash 问题和解决方案推断 归纳法: 从特殊到一般,从最近频发的 crash 问题找出共性特征 二分法: 用二分法合理划分问题域,不断缩小范围 4) 大胆假设,小心求证 假设条件,测试,排除,不断重复,缩小范围 有必要时画一张思维导图,记下每条排查路径 5) 君子性非异也,善假于物也 查询 google, stackflow, 听取同事的意见 最后一条,看看破案和推理小说及剧情,学学侦破技术 如何找线索, 如何勘查现场, 如何排查嫌疑 如何查询积案,进行并案 有一些惯犯和惯用作案手段值得研究 多线程处理不当 多个线程操作一块内存区域,没有安全地加锁和串行化 合局和单例对象是重点排查对象 内存处理不当 内存管理不当,用到的内存却给别人破坏了,例如 试图释放已经释放了的内存 试图释放并未分配的内存 试图读写已经释放了的内存 试图读写并未分配的内存 内存分配错误, […] →Read more

前端工具链

脚手架工具 生成模板代码,例如 yeoman 依赖管理工具 管理依赖代码,例如 bower 构建工具 预处理代码,例如 gulp →Read more

WebRTC Simulcast

简介 Simulcast 可以翻译成联播,不是新闻联播,而是多个媒体流的传播,如图所示 注: SFU 即 Selective Forward Unit, 媒体转发服务器 刚开始,发送方 sender 发送一路 1080p 的视频流给服务器 SFU, SFU 再转发给多个接收方 receiver1, receiver2 和 receiver3。 一会儿,receiver 2 和 receiver 3 通过 RTCP 反馈带宽不够,丢包率和延迟都比较大,也就是说 上行带宽对于 sender 是足够的, 下行带宽对于 receiver 1 也是没问题的 下行带宽对于 receiver 2 和 receiver 3 都有问题 这样联播的好处就来了,SFU 可以根据带宽评估的结果让 Sender 同时发送 1080p, 360p 和 180p 三路流,并分别转发给 receiver1, receiver […] →Read more

化繁为简的状态模式

最近看了同事写的一块代码,逻辑非常复杂,我们讨论了实现的方式,我建议他改用状态模式, 这样可以省去很多复杂的判断分支 这是用状态模式的做法 不用状态模式的代码大致如此 if(cpuRatio < xxx && memRatio < xxx) { state=Normal } else if(cpuRatio > xxx && memRatio > xxx) { state=Busy } else if(cpuRatio > xxx && memRatio > xxx) { state=Crazy } if(state == Crazy) { delegateOtherDoSomething() } else if (state == Busy) { complainAndDoSomething() } else if (state == Normal) […] →Read more

GStreamer Quick Start

note of https://gstreamer.freedesktop.org/documentation/tutorials/basic/hello-world.html GStreamer is a framework for constructing graphs of various filters (termed elements here) that will handle streaming media. Any discrete (packetizable) media type is supported, with provisions for automatically determining source type. Formatting/framing information is provided with a powerful negotiation framework. Plugins are heavily used to provide for all elements, allowing one […] →Read more