您如何获得 Windows 音频播放的当前采样率?

Posted

技术标签:

【中文标题】您如何获得 Windows 音频播放的当前采样率?【英文标题】:How do you get the current sample rate of Windows audio playback? 【发布时间】:2014-12-04 20:07:56 【问题描述】:

我正在使用 Windows waveOut API(又名 MME 或多媒体扩展)mmsystem.h。一些程序会更改音频播放采样率(例如,从 44.1kHz 到 48kHz),这对我的程序检测当前播放采样率非常有用,因此它可以警告用户 Windows 将重新采样程序的输出。

根据本文档http://msdn.microsoft.com/en-us/library/aa909811.aspx,waveOutGetPlaybackRate 返回设备当前正在执行的重采样百分比(例如,设备以 44.1 播放,而程序以 44.1 播放音频,因此它将返回 1.0)。我很好奇是否有办法获得设备的绝对采样率,而不是相对的。在 Windows Vista/7/8 中,您可以通过以下方式手动找到该值: 控制面板 > 声音 > 播放,右键单击默认播放设备并选择属性,然后选择高级选项卡。所以我试图通过查询操作系统来获取这里的“默认格式”值。

有问题的程序是用 Pascal 编写的,但是,我通常使用 C/C++ 引用。

【问题讨论】:

msdn.microsoft.com/en-us/library/windows/desktop/… 感谢您的回答。它看起来有点复杂(考虑到程序中的功能有多小),但我最终可能会解决它。 【参考方案1】:
    //#include <iostream>
//#include <initguid.h>
//#include <Mmdeviceapi.h>

int main() 
    HRESULT hr;
    IMMDevice * pDevice = NULL;
    IMMDeviceEnumerator * pEnumerator = NULL;
    IPropertyStore* store = nullptr;
    PWAVEFORMATEX deviceFormatProperties;
    PROPVARIANT prop;

    CoInitialize(NULL);

    // get the device enumerator
    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (LPVOID *)&pEnumerator);

    // get default audio endpoint
    hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);

    hr = pDevice->OpenPropertyStore(STGM_READ, &store);
    if (FAILED(hr)) 
        std::cout << "OpenPropertyStore failed!" << std::endl;
    

    hr = store->GetValue(PKEY_AudioEngine_DeviceFormat, &prop);
    if (FAILED(hr)) 
        std::cout << "GetValue failed!" << std::endl;
    

    deviceFormatProperties = (PWAVEFORMATEX)prop.blob.pBlobData;
    std::cout << "Channels    = " << deviceFormatProperties->nChannels << std::endl;
    std::cout << "Sample rate = " << deviceFormatProperties->nSamplesPerSec << std::endl;
    std::cout << "Bit depth   = " << deviceFormatProperties->wBitsPerSample << std::endl;

    system("pause");
    return 0;

【讨论】:

再次感谢 Hans 为我指明了正确的方向。此代码示例获取默认播放设备(不是原始问题的一部分,但此类代码的大多数示例用于获取系统上所有设备的属性......),并获取“默认格式”,如图所示在控制面板 > 声音中。如果有人对此感到好奇,我也可以将其翻译成 Pascal。

以上是关于您如何获得 Windows 音频播放的当前采样率?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AVFoundation 以正确的音高播放不同采样率的音频文件?

如何使用python获取mp3文件的采样率

AudioTrack 采样率不一致

音频重采样

如何在 Windows 7 中更改音频输出设备的默认共享模式采样率?

如何更改插孔音频中的采样率?