如何在云电脑串流中实现声音输入输出—虚拟声卡(虚拟扬声器和虚拟麦克风)开发

这篇具有很好参考价值的文章主要介绍了如何在云电脑串流中实现声音输入输出—虚拟声卡(虚拟扬声器和虚拟麦克风)开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


虚拟声卡(虚拟扬声器和虚拟麦克风)技术原理简介

1. 背景

近些年云计算的发展可谓是势不可挡,无论是办公还是娱乐等行业都开始使用云计算来逐步替代直接使用本地物理硬件的技术,例如:

  1. 服务器部署。相比之前,现在部署一个服务器都非常简单;我们只需要在阿里云,华为云等购买相关主机(虚拟机)和服务即可,根本无需在公网部署一个硬件设备,这样我们非常容易就拥有了自己个人的公网服务器。
  2. VDI云桌面。该项技术目前主要是针对内网办公场景,企业通过桌面云集中管理员工虚拟主机,达到数据安全,集中管理,快速重复利用,一键式部署等功能。
  3. 云游戏。随着4G和5G网络的飞速发展,游戏也开始逐渐云化,很多传统游戏厂商和VR游戏厂商都开始支持云游戏;借助云游戏,我们如果需要玩大型游戏,本地无需高性能GPU和CPU的支持,甚至本地无需要对游戏进行直接安装,我们使用简单(廉价)终端就可以通过云游戏技术来体验大型游戏,达到与本地一致的体验效果。

我们以VDI云桌面办公为例,其大致的部署架构如下:

虚拟麦克风音频输入,虚拟化技术,电脑

如上图,一般来说:

  1. 客户端:指的是我们的瘦终端,一般使用的是普通硬件,比如性能比较差但是价格比较廉价的个人终端电脑。
  2. 服务器:这里指的是我们的虚拟机,是我们真实运行的主机(安装了各种办公应用或者游戏的虚拟机),它一般有高性能,方便管理等特性。

在云计算的背景下面,虽然我们云主机(上图的虚拟机)运行在了远端,给使用和管理带来了非常大的便捷,但是也带来了很大技术上面的困难。例如声音的播放和录制相比本地的使用实现就复杂很多,下面举几个相关例子:

  1. 如果我们使用云游戏,一个非常通用的功能就是接麦;由于我们的云主机一般是虚拟机,没有接入麦克风,这个时候如果需要接麦的话就会非常麻烦(如果是物理主机,麦克风在本地,远端主机也无法连接本地麦克风)。
  2. 如果我们使用VDI云桌面,也有类似的场景,例如我们使用直播软件或者教学软件进行声音广播;或者我们使用电话软件进行拨号的时候也是需要麦克风支持的,此时麦克风硬件在也是无法达到要求。
  3. 对于扬声器来说,虽然我们可以直接对扬声器声音进行捕获,然后在客户端(瘦终端)进行播放,但是虚拟机并没有扬声器设备,因此也无法达到需求(用户程序无法进行音频播放)。

面临这些问题,我们需要在虚拟机有扬声器和麦克风,并且需要能够做到:

  1. 扬声器:最基础的功能需要让用户软件可以识别到扬声器设备,并使用该扬声器进行声音播放,当然我们也可以在驱动中获取应用程序播放音频数据。
  2. 麦克风:麦克风就比较麻烦了,麦克风仅仅让相关用户软件能够识别到硬件设备还不足已解决问题,对于麦克风设备还需要支持喂数据的操作,将需要录制的音频直接传递给麦克风,达到真实声音录制的效果。

要解决上面这些问题,就需要在虚拟机中对声卡进行虚拟化,实现虚拟声卡驱动程序,使得用户程序能够使用扬声器播放声音以及可以对麦克风喂数据,将本地麦克风的数据喂给虚拟机的虚拟麦克风。

下面,将通过本文来分析虚拟声卡的实现原理,来实现虚拟扬声器和虚拟麦克风的功能。

2. 技术概要

2.1 用户层声音架构

在XP下面,Windows对于声音的处理架构基本如下:
虚拟麦克风音频输入,虚拟化技术,电脑

这种架构只有在XP系统下才支持,在这种模式下面我们可以发现,如果对于扬声器声音采集的话会非常麻烦,要么使用HOOK,要么实现虚拟扬声器在驱动中拷贝数据。

因此Windows在Vista版本对音频的架构做了很多的调整,Vista之后的版本架构如下:
虚拟麦克风音频输入,虚拟化技术,电脑

该架构下面,所有的声音都通过Core Audio API来进行控制,该架构下面声音有三种模式进行处理:

  • render模式 :该方式实际上就是播放声音,常见的API如PlaySound, WaveOutXXX, DirectSound,IAudioRenderClient等,具体的如何使用扬声器进行音频播放不是本文的重点,如果想了解Windows上的音频播放可以参考如下MSDN链接

https://learn.microsoft.com/en-us/windows/win32/coreaudio/rendering-a-stream

  • capture模式 :该方式实际上就是录入声音, 也就是我们通过麦克风输入声音,常见API如WaveInXXX,IAudioCaptureClient, 如果想了解更多关于如何从麦克风采集数据请参考如下MSDN链接:

https://learn.microsoft.com/en-us/windows/win32/coreaudio/capturing-a-stream

  • loopback模式 : 该方式就是把扬声器里播放的声音抓取下来,通常我们看到的流推软件中声音的推送就是使用该模式采集的。

在Vista系统音频架构中,我们对音频的开发也相对简单:

  1. MMDevice API:表示声音设备相关的接口,例如枚举声音设备等等。
  2. WASAPI:这个是Windows 声音会话相关的所有API,我们看到的IAudioClient等接口,以及最关键用于播放扬声器的IAudioRenderClient接口以及采集麦克风的音频数据的IAudioCaptureClient,都是由他提供。
  3. DeviceTopologyAPI:这个是设备拓扑结构管理的API,用于遍历音频设备适和音频终端的内部拓扑,并可以决定音频设备的连接顺序,通过DeviceTopology API中的接口和方法, 我们可以沿着Audio Adapter的硬件设备里的数据通道数据流程进行之配置,比如对音频终端设备的数据路径上流经音频数据流进行音量控制。
  4. EndPointVolumeAPI:这个是音量控制相关的API。

上述图中,声音的播放分为共享模式和独占模式:文章来源地址https://www.toymoban.com/news/detail-762237.html

  1. 共享模式:每个用户程序都在自己的会话进行声音播放

到了这里,关于如何在云电脑串流中实现声音输入输出—虚拟声卡(虚拟扬声器和虚拟麦克风)开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据集成的云计算解决方案:如何在云环境中实现数据集成

    数据集成是指将来自不同数据源的数据进行整合、清洗、转换和加工,以实现数据的一致性、统一性和可共享性。随着数据量的增加和数据来源的多样性,数据集成的复杂性也不断增加。云计算是一种基于网络的计算资源分配和共享模式,可以提供大规模、高可扩展性的计算

    2024年04月15日
    浏览(52)
  • 笔记本电脑没有麦克风,声音无法找到输入设备

    新买的电脑没有扬声器,电脑声音没有输入设备,在开腾讯会议的时候才发现竟然有这个问题。 网上找原因,哎,找了一大堆每一个靠谱的 这让我想起来上次电脑没有热键的问题,所有问题的终极解决方案,都在源头那里,网上的这些东西都是大家从源头那里吸收消化过的

    2024年02月07日
    浏览(81)
  • Win10 操作系统如何让不同的音频输出设备播放不同的声音

    应用案例:我做题时蓝牙音箱播放音乐,其他应用通过电脑扬声器播放声音。 鼠标左键点击 Windows 微标健,再点击设置按钮。 在搜索框中搜索“混音器选项”,按下回车。 打开混音器选项后就可以进行修改了。 右键点击任务栏右下角的声音图标,点击“打开声音设置”。

    2024年01月21日
    浏览(46)
  • 持续集成与持续交付(CI/CD):探讨在云计算中实现快速软件交付的最佳实践

    🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:云计算 ✨文章内容:软件交付 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 持续集成(Continuous Integration,CI)和持续交付(Continuous D

    2024年02月10日
    浏览(62)
  • 使用sunshine+moonlight 实现电脑串流到电视(Android 设备)低延迟投屏

    目前市面上的投屏软件大多存在视频质量不清晰,延迟严重,投屏收费等问题。 为解决电脑到电视或者投影仪无线连接进行投屏,目前使用基于nvidia开源项目的Moonlight是目前最佳的解决方案。 原本nVidia 的显卡内置的GameStream可以实现低延迟高画质的串流的,但是: 这就非常

    2024年02月08日
    浏览(58)
  • 吉他如何实现内录or通过转接头和简易声卡连接电脑没有声音怎么办

    目录 效果器or智能音箱 电吉他和效果器的连接 效果器和耳机or音箱连接 内录方法 为什么用6.5mm(入)转3.5mm(出)转接头内录无声音 整体连接图示 这篇文章我会以通俗的语言为初学者描述如何让电吉他“燃起来”,效果器以MOOER魔耳POGO迷你电吉他综合效果器为示例。然后我

    2024年02月15日
    浏览(85)
  • outputStream(输出流)转inputstream(输入流)以及输入流如何复用

    需求: 通过MultipartFile 上传文件到文件服务器,上传前要把文件转为pdf格式进行上传,并生成文件摘要用来验证服务器中的文件是否被篡改。 准备: 需要涉及到 inputstream(输入流)或outputStream(输出流)要使用两次 。 一、如果该文件本身就是pdf格式则直接进行上传。第一次

    2024年02月14日
    浏览(38)
  • 输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用

    上一篇博文我们使用矩阵键盘时面临的一个问题就是占用的端口多,以前我们扩展输出端口使用了74hc595,那么这里我们面临的是输入端口少需要扩展的问题,那么可以使用什么芯片来完成了?有没有直接可使用的芯片呢? 文章原出处: https://blog.csdn.net/haigear/article/details/13

    2024年02月04日
    浏览(94)
  • Pytorch模型如何查看每层输入维度输出维度

    在 PyTorch 中,可以使用 torchsummary 库来实现对 PyTorch 模型的结构及参数统计的输出,其可以方便我们查看每层输入、输出的维度以及参数数量等信息。 安装 torchsummary 库: 使用方法如下: 其中, model 是需要查看的模型, (3, 32, 32) 表示模型的输入维度,即 C = 3,H = 32,W = 32。

    2024年02月16日
    浏览(40)
  • AudioTrack的声音输出流程

    通过普通AudioTrack的流程追踪数据流。分析一下声音模块的具体流程。这里比较复杂的是binder以及共享内存。这里不做详细介绍。只介绍原理 java层的AudioTrack主要是通过jni调用到cpp层的AudioTrack。我们只介绍cpp层相关。 初始化 初始化只核心是通过set函数实现的。主要包括三步。

    2024年02月13日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包