云录音

在云游戏和云桌面项目中,总结了几类声音采集技术,把录音做到极致。

从外设录音

最典型的就是麦克风,内置麦克风、外置麦克风,其实还有一种通过 LineIn 插入的其它播放器设备,比如 CD、DVD 等。

采集这种音频的方法可以只用 ffmpeg 搞定:av_find_input_format(“dshow”)…,也可以用 CoreAudio 搞定:

1
2
enumerator->EnumAudioEndpoints(eCapture, DEVICE_STATE_ACTIVE, ...
audio_client->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK ...

从播放设备回放录音

采集方式是用 CoreAudio:

1
2
enumerator->(eRender, DEVICE_STATE_ACTIVE, ...
audio_client->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_LOOPBACK, ...

这种方式会混音,比如说您开个 foobar 播歌,再开个 QQ 影音看电影,则会录到这两个应用程序的混音,嗯,如果 QQ 再嘀嘀嘀,也是会混进去的……

虚拟声卡采集

有个叫 Virtual Audio Cable 的虚拟声卡,能虚拟多张声卡,并且可以把声音转发到对应的虚拟 LineIn 设备,供应用程序采集。

只录制某个应用程序的音

比前一种更先进一些,多个播放器同时播歌,我们可以只录其中一个。

采集方法是:Hook CoreAudio。

另一个思路是:Hook 到这个应用,给它单独指定一个输出设备,其它应用不能用,否则还是混音了,然后用前面的回放录音技术录制这个独占的输出设备。您可能要说,哪有那么多输出设备?这个问题可以用前面提到的虚拟声卡解决,分分秒虚拟出 64 个是没问题的。而且用 VAC 的好处是,可以在这 64 个对应的 LineIn 通道直接录制,不需要用 CoreAudio,兼容性会更好。

卸载 LSP 并重启系统依然有服务加载它

发现问题,2012-12-11 18:16:00

  快游(网游加速器)包含一个 LSP,属于加速核心组件,在测试 LSP 期间,发现一个奇怪的现象:反注册它,并 netsh winsock reset 加重启好几次……依然有程序加载它。用 Process Explorer 查看是:IpOverUsbSvc.exe 和 daemonu.exe。把 LSP 的 DLL 文件删掉,再重启,可以消灭这个奇怪的现象。但后来想重现这个怪现象时,却无法重现。

重现和解决问题,2012-12-25 15:38:00

  问题自然重现,继续研究。这两个进程对应的服务名是:IpOverUsbSvc 和 nvUpdatusService。手动重启这两个服务后,即不再加载 LSP。推理:这两个服务很可能每次重启机器时都没有正常关闭,系统提供了某种机制让他们在下一次重启后快速恢复了运行现场(保留了有 LSP 注册时的环境)。

分析问题,2013-03-26 23:24:30

  时隔三个月,偶然看到介绍”混合式关机”的文章,恍然大悟,原来是这货引发的八哥!

在安装 Win8 后,很多人都体验到了其开关机惊人的速度,尤其是开机速度,相比 Win7 之下,它提升的不止是一点半点。在某些超极本和配备了 SSD 的机器上,其开关机速度可以在数秒以内。例如 Surface Pro,其实测系统引导速度为2秒,从启动到自动登录到开始屏幕只要6秒。

究竟是什么技术提升了 Win8 的开关机速度呢?如果要用最简单的一句话概括,那应该是”系统会话休眠”,或者更简单的,”混合式关机”。

在 以往的 Windows OS 中,典型的关机顺序为:

  1. 单击”关机”。

  2. Windows 广播运行应用程序关机信息,让应用程序可以保存数据和设置。应用程序也可以要求一些额外的时间以结束其当前工作。

  3. Windows 为每个登录用户关闭用户会话。

  4. Windows 向服务发送关机信息,通知已开始关机,接着关闭服务。如果服务未响应,系统将强制关闭。

  5. Windows 向设备广播信息,示意设备进行关闭。

  6. Windows 关闭系统会话(也称为”会话 0”)。

  7. Windows 刷新系统驱动器待决数据,以确保完全保存。

  8. Windows 通过 ACPI 界面向系统发送信号以给计算机断电。

看着以上的典型关机步骤,你是不是也有想到一些步骤对应的屏幕上的 UI 表现呢~

再来看看 Windows 8 采用的混合式关机主要步骤:

  1. 单击”关机”。

  2. Windows 广播运行应用程序关机信息,让应用程序可以保存数据和设置。应用程序也可以要求取得一些额外的时间以结束其当前工作。

  3. Windows 为每个登录用户关闭用户会话。

  4. 系统会话休眠,并掉电。

可见,Windows 8 只关闭用户会话而不像以前那样完全关闭计算机。此时, Windows 不再等待并结束系统服务和关闭会话 0,而是让其进入休眠。这种关闭用户会话+休眠系统服务和系统会话的做法,被称为”混合式关机”,也就不难理解了。

或者说得通俗点,就好比你之前打扫卫生时,需要先组装专业的拖布,组装好了以后,才能开始打扫卫生。而现在,你可以拿起拖布直接开始打扫,因为你上次打扫完之后,并没有将拖布这一工具像以往那样拆卸下来收好。

开机在结构上是关机的逆过程,所以有了混合式关机,开机自然也就快了。但是,除了 RAID 卡外,一般硬盘的读取速度会比写入速度略快,加上关机的时候,系统会通知并等待应用程序退出,所以从感官上,开机过程会比关机过程显得要快一些。

枚举物理网卡

  其实目的是获取靠谱的 MAC 地址,但这个任务真蛋疼!不信您看看搜索出来的乐射……

  神马 GetAdaptersInfo、GetIfEntry、GetAdaptersAddresses、NetWkstaTransportEnum,还有读取注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards。这些都会枚举到虚拟网卡,给您举个例子“VirtualBox Host-Only Ethernet Adapter”,读取神马 NetCfgInstanceId、MediaSubType,都不靠谱,没有平台移植性!

  用 Setup API 枚举 Interface,匹配 PCI 和 USB 类型是比较靠谱的。

  蛋似,虚拟机的网卡也是虚拟的,为了方便在虚拟机测试,您要注意放开一些特例……很抱歉,领导说代码要保密,自己搜吧,关键字:SetupDiGetDeviceInterfaceDetail、OID_802_3_PERMANENT_ADDRESS。

  给个蛋碎的例子:\\.\pci#ven_10ec&dev_8168&subsys_050e1028&rev_06#4&224db6dd&0&00e5#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{4cc0ea76-88b7-40e1-8b4b-6339f8dd49bf} 可以简称为 \\.\{4cc0ea76-88b7-40e1-8b4b-6339f8dd49bf} 或者 \\.\Global\{4cc0ea76-88b7-40e1-8b4b-6339f8dd49bf}

从 Windows 8 新功能推理马头流量的八哥

  Windows 8 确实是个不错的系统,DP、CP、RC、RTM,UMU 一路追过来。

  在开始讲故事之前,要先介绍一下马头流量,http://www.matocloud.com/,同类产品:上网快鸟、飞速流量、瓦力流量、彩虹流量……当然,这些都是设设 APN 而已,马头的 Android 版本有更高深的技术。想了解更多,请研究一下 EnoVPN、VPN Service。

  再来是流量压缩原理简介:主要是压缩图片。APN 就是一个 HTTP 代理,只不过这个代理有点不标准,会将原图压缩后交给用户,用户下载的是一张小图,自然就省流量。但这是有副作用的,有的图片必须是有损压缩才会变小,所以必然会降低图片质量。知道这个原理后,可能会有人会纠结了……至于您用不用,就看您在图片质量和流量之间的取舍了。

  故事开始了!UMU 用 HTC Titan 拍过不少图片,当然其中不少是横屏拍的。这个手机有重力感应功能,拍的照片会带 Orientation 信息,这是 Exif 的一个字段,专业知识请另行搜索“Exif Orientation”。简单讲,无论您拍照时手机是横是竖,在手机看时,照片都会自动旋转,使景物是正立的。如果您没注意过,可以先在就做这个实验,把 iPhone 倒立拍照,正立过来看,景也会跟着自动转……

  当 UMU 把图片同步到电脑上时,情况就不同了。Windows 7 自带的画图、图片查看器都不支持对 Orientation 自动校正,IE9、IE10、Chrome 22.0.1229.94 m、Paint.NET 也都不支持。所以,UMU 经常看到横屏拍的照片,在 Windows 7 上是歪 90 度显示的。

  到 Windows 8 上,自带的画图、图片查看器都支持 Orientation 校正了!有一天,UMU 在看以前拍的图片时,突然发现,所有的图片都正立了……

  蛋似,前面有提到 IE10 是不支持的,所以……UMU 特地上传了一张横拍的图片到腾讯微博上,果然这图就是歪 90 度的,缩略图和原图都是。然后再用 iPhone 看,缩略图是歪 90 度,这说明腾讯微博的缩略图也没考虑 Orientation 信息,点击查看原图,终于正立了,因为 iPhone 基本到处都支持 Orientation 自动旋转校正。

  把这个发现,和马头流量结合起来思考——APN 服务器上的图片压缩程序会不会也没考虑 Orientation 信息?UMU 猜想是很有可能的,腾讯就没考虑到……然后开始测试!用 WiFi 看原图,是正立的,因为 WiFi 下,马头流量不会压缩图片;改用 3G,马头流量开始起作用,再去看原图,发生了两件事,大家应该猜到了——图片质量下降、图片歪了 90 度!八哥!这就是八哥啊!