Stay Hungry, Stay Young. 👋

慢下来才能更快
– Marshall Liu

2026:向上生长,寻找变化。朝阳下,一条道路穿过绿色山丘,蜿蜒通往远方。

【置顶】2026

记录跟踪2026年要做的事情和正在做的事情。 目标 健康生活 体重减到60kg 探索可能 英语能力,熟练3篇演讲短文 独立开发,目标完成4个独立项目 –> 进度2/4 公众号输出,目标输出文章10篇 –> 进度12/10 ...

二月 22, 2026 · 1 分钟 · 489 字 · Marshall Liu
褚氏农业提供的褚橙种植基地果园全景

读《褚时健传》:不闲着,把每一天过实

读完褚时健的起落,最触动我的不是“逆袭”,而是他到晚年仍愿意在慢事情上认真投入。家庭的缺憾、企业的盈利,以及对可控之事的专注,也让我重新想了想什么叫不虚度。

十一月 9, 2026 · 4 分钟 · 1939 字 · Marshall Liu
三路音频波形汇入求和节点,经过限幅后形成一路连续的播放波形

WebRTC 多路音频混音:从接收流到求和与限幅

两个人同时说话,扬声器最终只能收到一路播放数据。最直观的做法是把两个波形逐样本相加;问题是相加后的峰值可能超过 16 位 PCM 的表示范围。直接截断会失真,简单地除以人数又可能让只说话的那个人变小声。 WebRTC 的默认选择是:接收端逐路取出 10 ms 音频,统一格式后用浮点数求和,再用 Limiter 控制合成音频的峰值。 本文以本地源码提交 c8bca1867e(2026-10-22)为基线,先看播放链路,再比较三种混音方法。 ...

十一月 9, 2026 · 9 分钟 · 4058 字 · Marshall Liu
WebRTC 音频丢包恢复:RTP 时间轴中的丢失音频包由后续包携带的冗余信息修复,波形经 NetEQ 保持连续

WebRTC 音频丢包恢复:NetEQ、Opus FEC、NACK 与 PLC 如何协作

视频丢一帧,画面可能短暂卡住;语音丢掉一个承载 20 ms 音频的包,则可能吞掉一个关键的辅音片段。接收端还必须按时向扬声器交付 PCM:原包即使最终到了,错过播放时刻也无法补回已经听到的声音。 所以讨论音频丢包恢复,先要问:缺失的音频在播放截止时间前,究竟还有没有机会拿到? 有机会,就争取拿到编码数据;没有机会,就生成一段连续的替代声音。本文以本地 WebRTC 源码提交 c8bca1867efcbc5f52adf58ad4463088ed257aa0(2026-10-22)为基线,说明这些选择如何落到 WebRTC 的音频链路中。 ...

十一月 5, 2026 · 9 分钟 · 4446 字 · Marshall Liu
WebRTC 音频设备管理:ADM 连接麦克风、扬声器和桌面及移动平台,橙色与蓝色波形分别表示采集和播放数据流

WebRTC 音频设备管理:从双向数据流到跨平台实现

麦克风把声音变成 PCM,扬声器把 PCM 变回声音。对一个实时通话系统来说,这两句话之间还有很多事情:选择设备、协商格式、启动音频流、适应设备回调的节奏,以及在耳机拔出、来电中断后恢复工作。 WebRTC 把这些工作集中在 Audio Device Module,简称 ADM。理解它,最好先建立整体位置,再沿着音频数据走一遍,最后进入代码和平台实现。否则很容易把“设备缓冲”“网络抖动缓冲”和“回声消除”混成一件事。 本文以本地 webrtc_src 的提交 3dec7d05377fb690e84f503db865edde982ab2a5 为源码基线,提交日期为 2026-10-23。正文主要讨论使用内置设备模块的 native 音频路径;浏览器或业务方可以注入自己的 ADM,复用这里的接口而采用不同的数据通路。文中的源码链接固定到该提交,代码片段会标明是否经过简化。 ...

十月 25, 2026 · 27 分钟 · 13249 字 · Marshall Liu