手机实时提取SIM卡打电话的信令声音-新的篇章(三、Android虚拟声卡探索)
前言
前面的篇章中,我们从理论方向和实际市面上出现的音频线传输声音的方式,讨论绕开手机对SIM卡电话通话声音的封锁场景的可行性,并实际选购几款数字和模拟的USB转接3.5mm音频口的转接头和耳机进行测试,验证这个方向对Android手机型号和系统版本的影响和支持力度。
本篇章中,我们尝试从虚拟声卡的角度来构思一下,如何不用任何外置配件的方式,提取到手机或电脑设备中输出的声音数据。
由于GCC编译体系中,Linux、Windows、Android、嵌入式Linux基本不分家,我们可以采用先从电脑版本的Linux或Windows系统中把方案架构和测试工具和测试手段都整理出来后,再尝试将它们移植到Android和嵌入式Linux的方式,进行迁移和验证。进而得出这些方式或方法是否有效、以及是否符合预期要求的评估结论。
什么是虚拟声卡
虚拟声卡是一种软件程序,允许用户在系统中创建一个虚拟的音频设备。通过这个设备,用户可以输入和输出音频数据,而无需依赖物理声卡。虚拟声卡尤其适用于需要音频路由的应用,比如录音软件、在线会议等。
虚拟声卡有什么作用
虚拟声卡主要用在没有声卡的机器上实现声音播放等功能。它是一种软件解决方案,允许计算机在没有硬件音频设备的情况下产生和处理声音。
常见的虚拟声卡的场景有哪些
要说虚拟声卡的常见场景,在云服务器的各种虚拟容器中进行软声卡的安装后再将声音传输到本地播放的场景是我们最常见的虚拟声卡的场景。因为通常在云服务器和云服务器划分的虚拟容器中,是不存在物理声卡的,要想让远程的机器发声或者让容器内依赖声卡工作的软件能正常安装和使用,最简单的方式就是在容器中配置虚拟声卡(可能会包括驱动和内核应用),通过虚拟声卡把声音进行回传或按预制的方式进行处理。
至于Android的虚拟声卡,现在市面上云手机大把,随便一搜到处都是,它们也是在云服务器中分割出一个个容器,然后再上面安装各种软件,把声音传输回本地设备进行播放。从理论上来说,Android的虚拟声卡与普通的远程Windows或Linux中配置的虚拟声卡并不存在本质上的区别。
你看,其实虚拟声卡到处可见,属于老生常谈的应用场景。阳光下并没有太多新鲜的事情。
在乌班图(Ubuntu)中配置虚拟声卡
Linux中由于yum源的众所周知的原因,我们一般采用Ubuntu来进行宿主机环境的验证。在Ubuntu中,虚拟声卡通常采用snd-aloop来进行,即通过apt-get install alsa-utils安装了对应工具集后,通过配置/etc/modprobe.d目录下的文件,把虚拟声卡加载到Linux系统当中。在使用的时候,可以使用aplay -l 查阅系统中配置的声卡,并大致如下:
sudo apt-get install alsa-utils
sudo modprobe snd-aloop
lsmod | grep snd_aloop
arecord -l
aplay -l
如果需要虚拟声卡在启动的时候就自动创建,就需要修改/etc/modprobe.d/alsa-base.conf文件,在文件内添加如下一行内容后,运行sudo alsa force-reload命令重启音频服务即可。
创建虚拟声卡
options snd-aloop index=0
如果不需要自动创建则不用配置,只需要手动运行sudo modprobe snd-aloop命令即可,如下图所示:
Win/Linux/Android不同平台的声卡的差异
Android和Linux都使用ALSA框架来进行声音音频的调度,对于普通声音而言,二者除了使用的授权上有差异之外,其余方面并无特殊的差异。
Windows方面由于音频驱动架构方式的不同,在部署和使用上存在较大的差异,但Github中本身就存在有开源库Virtual Audio Pipeline,下载地址为:https://github.com/syams86/Virtual-Audio-Pipeline
我们在早些年的篇章中对Windows平台虚拟声卡的使用进行了描述,感兴趣的读者可以自行查阅《电脑蓝牙打电话-总结(篇外、虚拟声卡选型)》电脑蓝牙打电话-总结(篇外、虚拟声卡选型)_vb-audio virtual cable-CSDN博客
虚拟声卡如何测试和检验效果
上述操作中创建的虚拟声卡,都是成对出现的,即同一个声卡card号的device 0 和device 1一个做输入另一个做输出。
在使用中,我们可以简单的对device 0做播放音频文件,然后对device 1进行录音,或者反过来操作,实现声音和通话的全双工通信。如下图所示:
我们在Linux中可以使用【arecord -D hw:1,1,2 -r 采样率 -t wav 文件名】的方式对虚拟声卡进行录制,使用【aplay -D hw:1,0,2 -c 1 -r 采样率 文件名】的方式对虚拟声卡进行播放,实现将文件10086.wav通过虚拟声卡播放并转录到10086_output.wav文件的目的,如下图:
我们将播放的原始文件和转录后的输出文件,使用GoldWave或其它音频播放工具进行打开和查阅,可以很容易看出虚拟声卡的录制是能正常生效的。也即使用此方式在Linux中创建的虚拟声卡,能够正常应用在声音数据的重定向和提取。理论上,此方式也应该能正常迁移到Android系统或嵌入式Linux中,供具有root超级用户权限的应用进行运行和使用。
小结与思考
经过我们对Linux和Ubuntu的一顿命令和文件数据操作,我们很简单的就通过电脑桌面的方式复现了虚拟声卡对媒体应用在声音传输方向的提取和加工操作。当前的计算机世界完全具有完善的方案进行此类普通声音或语音文件的媒体操作能力。
但这里的虚拟声卡其实还有一个最重要的使用场景没有验证:它能传递普通的音乐和铃声等声音,但它能传递电话通话的声音吗?而这才是跟本次主题息息相关的问题。
这个疑问,并非没有先例。安卓手机在同屏共享领域有一个非常知名的开源软件scrcpy,它在针对Android11及以上版本就提供了声音共享的能力,使电脑和手机同屏共享时能把手机播放的声音清晰的从adb传输线中同步到电脑进行播放。但是,打电话时的声音通道无法被共享。
因此,在这一块上,如果我们需要对当前预研的课题进行打电话声音方向上的提取,使用ALSA方式或PulseAudio进行声音数据的提取,需要进行更多和更细致的扩展和适配,并不是看上去的那么简单。