windows系统程序在没有麦克风权限的情况下如何采集麦克风声音

今天测试自己的音频采集程序,发现如果设置里关闭了下面图片第3处,程序采集音频失败。

但是讯飞同传软件可以采集,很好奇它使用了什么黑科技?

后面研究了一晚上,发现它采集依赖2个SYSTEM进程,

hisee_record_service.exe和hisee_audio_record.exe。

hisee_record_service.exe是开机自启动的后台服务。

如果讯飞同传软件启动采集,会启动hisee_audio_record.exe进程。

hisee_audio_record.exe进程去采集到音频,然后通过websocket的方式发给讯飞同传。


Windows下程序想要采集麦克风的音频,都需要在设置里打开麦克风的权限。

win10系统的设置路径是:设置-系统-声音-麦克风隐私设置。

上面有3个开关:

第1个开关需要打开,如果这个不打开,下面2和3都无法打开。

第1个开关和第2个开关打开时,第3个开关才能打开。

下文讨论的是在只打开第1个开关,不打开第2个和第3个开关的情况下,让我们的应用可以访问麦克风。


采集程序的代码如下,使用了miniaudio库:

/*
Demonstrates how to capture data from a microphone using the low-level API.

This example simply captures data from your default microphone until you press Enter. The output is saved to the file
specified on the command line.

Capturing works in a very similar way to playback. The only difference is the direction of data movement. Instead of
the application sending data to the device, the device will send data to the application. This example just writes the
data received by the microphone straight to a WAV file.
*/
#define MA_DEBUG_OUTPUT
#define MINIAUDIO_IMPLEMENTATION
#define MA_ENABLE_ONLY_SPECIFIC_BACKENDS
#define MA_ENABLE_WASAPI
#include "../miniaudio.h"

#include <stdlib.h>
#include <stdio.h>

void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)
{
    ma_encoder* pEncoder = (ma_encoder*)pDevice->pUserData;
    MA_ASSERT(pEncoder != NULL);

    ma_encoder_write_pcm_frames(pEncoder, pInput, frameCount, NULL);

    (void)pOutput;
}

int main(int argc, char** argv)
{
    ma_result result;
    ma_encoder_config encoderConfig;
    ma_encoder encoder;
    ma_device_config deviceConfig;
    ma_device device;

   /* if (argc < 2) {
        printf("No output file.\n");
        return -1;
    }*/

    encoderConfig = ma_encoder_config_init(ma_encoding_format_wav, ma_format_f32, 2, 44100);

    if (ma_encoder_init_file("luobotest.wav", &encoderConfig, &encoder) != MA_SUCCESS) {
        printf("Failed to initialize output file.\n");
        return -1;
    }

    deviceConfig = ma_device_config_init(ma_device_type_capture);
    deviceConfig.capture.format   = encoder.config.format;
    deviceConfig.capture.channels = encoder.config.channels;
    deviceConfig.sampleRate       = encoder.config.sampleRate;
    deviceConfig.dataCallback     = data_callback;
    deviceConfig.pUserData        = &encoder;

    result = ma_device_init(NULL, &deviceConfig, &device);
    if (result != MA_SUCCESS) {
        printf("Failed to initialize capture device.%d\n", result);
        return -2;
    }

    result = ma_device_start(&device);
    if (result != MA_SUCCESS) {
        ma_device_uninit(&device);
        printf("Failed to start device.\n");
        return -3;
    }

    Sleep(20 * 1000);
    
    ma_device_uninit(&device);
    ma_encoder_uninit(&encoder);

    return 0;
}

如果设置里第3点没打开,没有麦克风的权限,内部使用WASAPI的IAudioClient的Initialize方法下面的函数会失败,返回错误码E_ACCESSDENIED。


下面重点来了,如何在第3点关闭的情况下去采集到麦克风音频?

其实原理很简单,把程序做成后台服务。

管理员权限打开cmd执行

sc create luobo111_system binPath= "D:\luobo\my_demo\test\buildx64\miniaudio\Debug\testMiniAudio3.exe"

net start luobo111_system

上面首先是创建一个名为luobo111_system 的后台服务,执行路径是"D:\luobo\my_demo\test\buildx64\miniaudio\Debug\testMiniAudio3.exe",然后启动了这个服务。


结论:

我猜想由于服务进程是SYSTEM用户运行,有很高的权限,所以绕过了设置里第3点的控制。


原创不易,欢迎打赏。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows中使用FFmpeg进行麦克风采集,可以通过使用dshow方式来实现。dshow是一种主要用于抓取摄像头、采集卡和麦克风等设备的方式。可以使用以下命令来采集麦克风的音频: ffmpeg -f dshow -i audio="麦克风设备名称" output.mp3 在上述命令中,将"麦克风设备名称"替换为实际的麦克风设备名称,并将output.mp3替换为所需保存的音频文件名。例如,如果麦克风设备名称为"Microphone",可以使用以下命令进行采集: ffmpeg -f dshow -i audio="Microphone" output.mp3 这将从麦克风设备中采集音频,并将其保存为output.mp3文件。你可以替换文件名和设备名称以满足你的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ffmpeg win10 ffmpeg 采集数据](https://blog.csdn.net/longji/article/details/124187706)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Windows下使用ffmpeg采集音频视频](https://blog.csdn.net/Tang_Chuanlin/article/details/86498772)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值