精华内容
下载资源
问答
  • windows声卡实时输出电平 参考:IMMDeviceEnumerator 如何获取音频设备的名称 https://blog.csdn.net/u011417605/article/details/48630677 #include <iostream> #include <mmdeviceapi.h> #include ...

    windows声卡实时输出电平

    参考:IMMDeviceEnumerator 如何获取音频设备的名称

    https://blog.csdn.net/u011417605/article/details/48630677

    #include <iostream>
    #include <mmdeviceapi.h>
    #include <endpointvolume.h>
    #include <Functiondiscoverykeys_devpkey.h>//PKEY_Device_FriendlyName

    int main()
    {
        std::cout << "Hello World!\n"; 
        CoInitialize(NULL);
        IMMDeviceEnumerator* pEnum = NULL;
        IMMDevice* pDevice = NULL;
        IAudioMeterInformation* pMeter = NULL;
        float peak;

        HRESULT hr;
        hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
            NULL,
            CLSCTX_INPROC_SERVER,
            __uuidof(IMMDeviceEnumerator),
            (void**)& pEnum);

        hr = pEnum->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);

        pDevice->Activate(__uuidof(IAudioMeterInformation),
            CLSCTX_ALL,
            NULL,
            (void**)& pMeter);

        UINT count = 0;
        pMeter->GetMeteringChannelCount(&count);
        float* peaks = new float[count];
        while (true)
        {
            pMeter->GetChannelsPeakValues(count, peaks); // I need this value
            for (int i = 0 ; i < count;i++)
            {
                std::cout << i + 1 << ":" << peaks[i] << "," << 10*log(peaks[i]) << "db;";
            }
            std::cout << "\n";

            Sleep(100);
        }
    }
     

    展开全文
  • 转自:http://shanewfx.github.io/blog/2013/08/14/caprure-audio-on-windows/前一段时间接到一个任务,需要采集到声卡输出信号,以便与麦克风的输入信号进行混音。在考虑如何实现这个需求前,我们先讨论下电脑...

    转自:http://shanewfx.github.io/blog/2013/08/14/caprure-audio-on-windows/

    前一段时间接到一个任务,需要采集到声卡的输出信号,以便与麦克风的输入信号进行混音。

    在考虑如何实现这个需求前,我们先讨论下电脑声音的三种模式:

    1) render模式

    该方式实际上就是播放(output)声音,常见的API如PlaySound, WaveOutXXX, DirectSound等

    2) capture模式

    该方式实际上就是录入(input)声音, 也就是我们通过麦克风输入声音,常见API如WaveInXXX

    3)loopback模式

    该方式就是我们需要实现的方式,即把扬声器里播放的声音抓取下来。

    对于上面3种方式,render和capture方式应该比较好理解, 也都是系统有API直接支持的方式, loopback方式就比较奇怪了,在XP上该方式系统实际都没有正式支持, loopback的录制方式实际上也涉及到CD的版权问题。

    之前一直没有研究过音频的相关技术,这次就顺便抽出一点时间去了解了一下Windows上采集音频的相关技术。

    对于音频处理的技术,主要有如下几种:

    采集麦克风输入

    采集声卡输出

    将音频数据送入声卡进行播放

    对多路音频输入进行混音处理

    1.Windows上音频处理的API

    在Windows操作系统上,常用的音频处理技术主要包括:

    Wave系列API函数、

    DirectSound、

    Core Audio。

    其中,Core Audio只可以在Vista以上(包括Vista)的操作系统中才能使用,主要用来取代Wave系列API函数和DirectSound。

    Core Audio实现的功能也比较强大,能实现对麦克风的采集、声卡输出的采集、控制声音的播放。

    而Wave系列的API函数主要是用来实现对麦克风输入的采集(使用WaveIn系列API函数)和控制声音的播放(使用后WaveOut系列函数)。

    DirectSound能够实现的功能估计和Wave系列API差不多,可能会更强一些(由于没有使用过DirectSound,不太肯定!)。

    为了实现采集模块对操作系统的兼容性更好,基本上对麦克风输入的采集使用WaveIn系列API函数比较多;

    在Windows XP系统中,没有直接提供对声卡输出进行采集的API,因此,在Windows XP要实现对声卡输出的采集会比较麻烦。

    通常可选用支持混音的声卡,然后通过使用声卡的混音模块来实现采集,但并不是所有的声卡都支持混音的功能,这样的方案不具备通用性。

    要实现通用性,可以采用虚拟声卡的方式来实现,从驱动层获取声卡的输出数据,但这种方案实现难度会比较大。

    而在Vista以上的系统中,如Win7,则可以使用Core Audio中的API函数来实现采集声卡输出的功能。

    对于混音模块的实现,目前基本是使用自定义的混音算法来完成功能,系统没有直接的API函数可供调用。

    2.使用WaveIn系列API函数实现麦克风输入采集

    涉及的API函数:

    waveInOpen

    开启音频采集设备,成功后会返回设备句柄,后续的API都需要使用该句柄

    调用模块需要提供一个回调函数(waveInProc),以接收采集的音频数据

    waveInClose

    关闭音频采集模块

    成功后,由waveInOpen返回的设备句柄将不再有效 

    waveInPrepareHeader

    准备音频采集数据缓存的空间

    waveInUnprepareHeader

    清空音频采集的数据缓存

    waveInAddBuffer

    将准备好的音频数据缓存提供给音频采集设备

    在调用该API之前需要先调用waveInPrepareHeader

    waveInStart

    控制音频采集设备开始对音频数据的采集

    waveInStop

    控制音频采集设备停止对音频数据的采集

    音频采集设备采集到音频数据后,会调用在waveInOpen中设置的回调函数。

    其中参数包括一个消息类型,根据其消息类型就可以进行相应的操作。

    如接收到WIM_DATA消息,则说明有新的音频数据被采集到,这样就可以根据需要来对这些音频数据进行处理。

    (示例以后补上)

    3.使用Core Audio实现对声卡输出的捕捉

    涉及的接口有:

    IMMDeviceEnumerator

    IMMDevice

    IAudioClient

    IAudioCaptureClient

    主要过程:

    创建多媒体设备枚举器(IMMDeviceEnumerator)

    通过多媒体设备枚举器获取声卡接口(IMMDevice)

    通过声卡接口获取声卡客户端接口(IAudioClient)

    通过声卡客户端接口(IAudioClient)可获取声卡输出的音频参数、初始化声卡、获取声卡输出缓冲区的大小、开启/停止对声卡输出的采集

    通过声卡采集客户端接口(IAudioCaptureClient)可获取采集的声卡输出数据,并对内部缓冲区进行控制

    (示例以后补上)

    4.常用的混音算法

    混音算法就是将多路音频输入信号根据某种规则进行运算(多路音频信号相加后做限幅处理),得到一路混合后的音频,并以此作为输出的过程。

    我目前还做过这一块,搜索了一下基本有如下几种混音算法:

    将多路音频输入信号直接相加取和作为输出

    将多路音频输入信号直接相加取和后,再除以混音通道数,防止溢出

    将多路音频输入信号直接相加取和后,做Clip操作(将数据限定在最大值和最小值之间),如有溢出就设最大值

    将多路音频输入信号直接相加取和后,做饱和处理,接近最大值时进行扭曲

    将多路音频输入信号直接相加取和后,做归一化处理,全部乘个系数,使幅值归一化

    将多路音频输入信号直接相加取和后,使用衰减因子限制幅值

    下面是XP时代的Audio架构图, 该架构下audio的合成和压缩都是在系统内核里进行的:

    在XP这种方式下,我们要抓去声卡播放的声音没有正规的方式, 一般来说只有2中:

    一种是虚拟声卡,还有一种就是Hook audio 播放相关的API (很多时候我们会发现API hook是没有办法时的全能办法 ^_^)

    但是在Vista之后,微软修改了原来的媒体架构, 以COM的方式重新封装了core audio API:

    以看到原来Auido的API (waveXXX, mixerXXX和DirectSound)都依赖下层的新封装的Core Audio

    APIs,而且这些APi都工作在用户模式, 也就是说声音的合成是在用户模式下通过软件实现的。在Vista之后,

    可以看到我们可以单独控制每个应用程序的声音了, 因为每路Audio都可以工作在不同的Audio session了。通过新的Core Audio

    API, 我们可以很容易的实现声卡声音的抓取

    展开全文
  • 对系统播放出来的声音进行录音是一个比较常见的需求,比如各类直播工具,就会把主播的声音经过麦克风采集下来,再与电脑里播放的...先看这个https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/core-audi...

    对系统播放出来的声音进行录音是一个比较常见的需求,比如各类直播工具,就会把主播的声音经过麦克风采集下来,再与电脑里播放的音乐合成(也就是混音),再推送到CDN,分发给观众;再比如屏幕录制也希望能够同时录制系统的声音输出。

    微软提供的Core Audio APIs中的WASAPI即是用来实现这一功能的。

    先看这个https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/core-audio-apis-in-windows-vista

    大意是说从windows vista开始提供的这套接口,它为更高层次的接口如DirectSound和waveXxx提供基石,开放出来满足更低层的开发。

    再看这个关于WASAPI的介绍:https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/wasapi?redirectedfrom=MSDN

    大意是说WASAPI使得客户端的应用能够在应用与音频端点设备之间管理音频数据流,头文件Audioclient.h和Audiopolicy.h给出了WASAPI接口的定义。

    再看这个https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/capturing-a-stream

    讲到了客户端调用IAudioCaptureClient接口从端点缓冲中读取捕捉的数据,可以用共享模式或独占模式。介绍了IAudioClient和IAudioCaptureClient这两个接口的一些方法的使用。并且附带了一个例子,是从默认的采集设备录制音频流的,如果要捕捉声卡输出的音频流,需要将eCapture改为eRender。

    再看这个关于Loopback Recording的https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/loopback-recording

    在loopback模式下,WASAPI客户端能够捕捉正在被渲染端点设备播放的音频流,如何以loopback模式打开一个流。

    最后提一下用到该项技术的开源软件OBS:https://github.com/obsproject/obs-studio

    具体源码参考插件win-wasapi的实现。

    此外还有两处文章值得参考:

    1.http://blog.sina.com.cn/s/blog_bb2d37f30102xdhf.html

    2.https://blog.csdn.net/u013898698/article/details/80251150

     

    展开全文
  • 基于CoreAudio获取声卡输出电平

    千次阅读 2016-01-15 14:52:23
    我使用CoreAudio获取声卡输出电平主要是为了做类似于windows的声音指示器控件,以实现功能为准,未做深入研究。 功能使用C++实现,需要包含两个头文件 #include "Mmdeviceapi.h " #include "endpointvolume.h...

    CoreAudio 不支持所有系统,vista win7 及以上的系统可以,XP不支持。

    我使用CoreAudio获取声卡输出电平主要是为了做类似于windows的声音指示器控件,以实现功能为准,未做深入研究。


    功能使用C++实现,需要包含两个头文件

    #include "Mmdeviceapi.h "
    #include "endpointvolume.h"


    先初始化,然后调用GetVolume()函数即可获取实时电平,返回值在0-1之间。


    使用CoreAudio可以非常便利的枚举设备、获取声卡输入或者向声卡输出数据,使用也很方便,msdn有非常详细的资料。

    之前使用CoreAudio的输入输出控制做过混音器,代码相比获取电平要复杂,在此不列出,有需要的可以另外跟我要。

    展开全文
  • windows环境,要做一个录制屏幕和声音的功能 通过gdigrap抓屏。通过dshow获取声音输入,但是声卡的声音我该怎么采集呢?
  • 按 QT 常用的QAudioOutput 播放音频 PC通过USB口和集线器,一共连接了10个声卡,9个USB声卡 一个PC自身声卡,在同时播放音频时候,总有一个USB声卡 无法播放,打开失败···· 换成winapi waveOutOpen来播放音频...
  • 前一段时间接到一个任务,需要采集到声卡输出信号,以便与麦克风的输入信号进行混音。 在考虑如何实现这个需求前,我们先讨论下电脑声音的三种模式: 1) render模式 该方式实际上就是播放(output)声音,常见的...
  • 同时将Windows10系统的声音输出到多个声音播放设备(声卡) 实现过程 下载安装Voicemeeter这款工具(接收自愿捐助形式的免费软件,挺良心了) https://vb-audio.com/Voicemeeter/ 安装完成后需要重启一下系统 ...
  • 尝试过了DirectSound MMSystem相关API 但只能够捕获到输入的音频, 目前希望能捕获到输出音频流, 类似QQ和YY给对方播放伴奏的功能(声卡没有混音的情况下), 由于要兼容xp似乎CoreAudioAPI并不能用, Hook方式较为暴力...
  • 主要是声卡驱动的问题,我希望使输出的延时越小越好。之前试过使用wavein,waveout但效果非常不理想。现在考虑使用portaudio,不知道行不行。请大家给点建议,能给出声卡实时录入输出的代码更好(不限于portaudio)...
  • virtual audio cable 虚拟声卡

    千次阅读 2019-07-08 20:23:48
    virtual audio cable 是一款windows虚拟声卡软件,可以一端做输入,另一端输出。 应用场景1:例如从远端TCP/UDP接收数据包转成本地声卡输出信号(录音),在本地播放器播放声音通过TCP/UDP发送数据到远端播放。 ...
  • 基本功能是把来自话筒、磁带、光盘的原始声音信号加以转换,输出到耳机、扬声器、扩音机、录音机等声响设备。本教程操作环境:windows7系统、Dell G3电脑。声卡转换器的作用是:将声卡的功能连接到其他设备上。声卡 ...
  • 大概是那么一天 我的声卡在一次升级中,再也发不出声音,鉴于笔记本声卡集成在主板上,维修成本过高,所以买了usb外置声卡。 悲伤来的总是很快,在今天,我的外置声卡丢了,于是再次尝试着为电脑找原因,最终我的...
  • 默认安装windows 2008 r2 时由于安全性 没有默认设置音频重定向 而导致远程登陆时软件播放声音提示没有发现声卡。同时又下角会出现提示未安装任何音频输出设备解决方法:使用Administrator账号登陆 ,确认windows ...
  • 声卡常见故障分析

    2013-03-12 12:20:00
    3.不支持PnP声卡的安装(也适用于不能用上述PnP方式安装的PnP声卡):进入“控制面板”“添加新硬件”“下一步”,当提示“需要Windows搜索新硬件吗?”时,选择“否”,而后从列表中选取“声音、视频和游戏控制器”...
  • 根据微软官网提供的KS层播放音频的demo修改;实现了音频数据的实时捕获与播放,在XP及以上平台测试,延迟均...KS层取数据为设备独占的方式,本工程采用第一个默认的外接声卡为对象实现,工程为VS2010,直接编译即可使用
  • 又来了,如果是Realtek的声卡,可以尝试一下,应用商店安装 Realtek Audio Control购买 Realtek Audio Control - Microsoft Store zh-CN​www.microsoft.com
  • 首先检查一下声卡输出的连线是否下确,音箱打开了没有,然后在"控制面板"中打开"系统",进入"设备管理器"后,查看"声音,视频和游戏控制器"里是否有声音设备.如果"声音,视频和游戏控制器"中没有声音设备,那么说明声卡的...
  • 声卡不再是一个复杂的问题。如果您使用Burr Brown的/德州仪器的芯片PCM2702...此声卡可以从USB端口供电,并有一个立体声输出。你不需要安装任何Windows XP和Vista的驱动程序,因为他们已经在里面。这是真正的即插即用。
  • 本文详细介绍了声音波形文件的存储格式,以及Windows提供的有关WAVE输入输出的API函数,对VC++中声音波形文件及声卡的编程进行了说明,并给出了一个实现声卡操作的类。
  • 声卡无法内录的替代方案

    千次阅读 2010-03-07 23:57:00
    Windows7系统,声卡为:Intel 82801IB ICH9,捕获声卡输出时发现无法完成,开始以为是Windows7的原因,查了一下发现设备里没有混音器,显示隐藏设备也找不到,这款声卡在XP下是否也是这样无法得知,有兴趣的朋友...
  • 制作PCM2702声卡

    千次阅读 2010-05-31 19:59:00
    声卡采用USB供电一通道立体声输出。在windows xp 和vista下面不需要安装驱动程序,因为它们已经被安装好了。真正的即插即用设备。 几个星期前我看到一个USB声卡叫做Alien DAC。这个挂在网上的项目计划激发了我做...
  • 要获得更好的效果或者需要数字输出时只能借助外置声卡了,包括pcmcia接口和usb接口两种,前者如创新的Audigy2 ZS Notebook,当然很贵了;后者如我的玲珑II,性价比还不错。 在Linux里不像Windows那样可以简单的在...
  • 显卡、声卡维修技术

    2018-07-24 15:14:00
    显卡承担输出显示图形的任务,是电脑的一个重要组成部分,所以掌握显卡的维修技术势在必行。 【技术95】显示颜色不正常 在Windows操作系统中,显示器显示的颜色不正常。此类故障产生的原因和解决方法如下。 (1)...
  • Windows上的音频采集技术

    千次阅读 2015-03-12 23:38:07
    AUG 14TH, 2013 | COMMENTS 前一段时间接到一个任务,需要采集到声卡的输出信号,以便与麦克风的输入信号进行混音。...采集声卡输出 将音频数据送入声卡进行播放 对多路音频输入进行混音处
  • 由于微软在Windows XP操作系统中对光驱的CD音频模式默认设为数字音频,所以如果您没有安装光驱的模拟音频输出线,很可能会导致在Windows XP操作系统下播放CD光盘时,声音只从声卡输出而无法从光驱音频输出孔输出的...
  • Windows平台音频采集技术介绍

    千次阅读 2018-10-30 18:48:51
    采集声卡输出 将音频数据送入声卡进行播放 对多路音频输入进行混音处理 在Windows操作系统上,音频处理技术主要是采用微软提供的相关API:Wave系列API函数、DirectSound、Core Audio。 我们简单的对以上接口从对...
  • 该程序是用VC++6.0设计的,其界面是标准的Windows的界面,其特点是,可以不间断地连续输出正弦波音频信号,而不像其它有类似功能的程序在输出信号时总是有间断的现象,并且,还可同时输出多种频率的信号

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 173
精华内容 69
关键字:

windows声卡输出