一、概述
本文主要测试在 FFmpeg 命令中使用 silenceremove filter 进行音频静音的修剪。
本文简述在 WPF 中绘制功率谱(Power Spectrum)。会将功率谱密度(PSD,Power spectral density)单位转换为分贝(dB, Decibel), 实现类似于 Adobe Audition 软件中频谱分析的功能。为简单起见及本人需要,FFT 数量使用 2048,窗口函数使用汉宁窗(Hanning)。


(图片来源:李超)
mediasoup 的服务端由两部分构成:
1、使用 C++ 编写的作为子进程的媒体层 (ICE, DTLS, RTP 等)。可执行文件在 Linux 或 macOS 上为 mediasoup-worker,在 Windows 上为 mediasoup-worker.exe。
2、使用 Javascript(Typescript) 编写的、基于 Node.js 的用于与 mediasoup-worker 进行通信的组件。因为官方或几乎所有第三方的 mediasoup 服务端都是使用的是 Node.js 来实现,所以官方提供一个中间层让开发者不直接和 mediassoup-workder 交互。
本文主要讨论如何使用 ASP.NET Core 替换 Javascript(Node.js) 的实现。

(备注:由于是在参考图基础上 PS 的,不太准确,有心情了再改吧。)
工作单元是”对象-关系”行为的一种模式。维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决。——《企业应用架构模式》
工作单元只是将所有修改状态保存下来,在适当的时候在同一数据库连接和事务处理上下文中一次性将对象的变更提交到数据中。额外的优点是既减少了数据库调用次数,又避免数据库长事务。
同一个工作单元一般不要跨线程使用。
工作单元常与仓储(Repository)模式一起使用。因为多个 Repository 可能做出多处更改,如果在 Repository 中调用 DbContext.SaveChanges 或 DbContext.SaveChangesAsync(如果使用 Entity Framework 的话),则产生了多个相互隔离开的事务。
实际上
Entity Framewok也实现了仓储模式(DbSet<T>)和工作单元模式(DbContext)。
直接使用工作单元也是可以的。配合依赖注入和拦截器能将工作单元的创建和完成提交的工作自动化,也就是说避免了手工创建工作单元和手工调用 Complete/Commit 。这种自动化使得应对复杂业务逻辑时不用过于关注业务无关的事务安全问题。