gpt4 book ai didi

macos - Mac OS X 中的音频捕获

转载 作者:行者123 更新时间:2023-12-03 00:20:33 35 4
gpt4 key购买 nike

我正在开发一个音频捕获应用程序。如何在 Mac OS X 上使用 8 kHz 采样率和使用 Audio Unit API 的单 channel 捕获音频?

这是我尝试过的代码。

    Component                   component;
ComponentDescription description;
OSStatus err = noErr;
UInt32 param;
AURenderCallbackStruct callback;

description.componentType = kAudioUnitType_Output;
description.componentSubType = kAudioUnitSubType_HALOutput;
description.componentManufacturer = kAudioUnitManufacturer_Apple;
description.componentFlags = 0;
description.componentFlagsMask = 0;
if(component = FindNextComponent(NULL, &description))
{
err = OpenAComponent(component, &fAudioUnit);
if(err != noErr)
{
fAudioUnit = NULL;
return err;
}
}
param = 1;
err = AudioUnitSetProperty(fAudioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &param, sizeof(UInt32));
if(err == noErr)
{
param = 0;
err = AudioUnitSetProperty(fAudioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, &param, sizeof(UInt32));
}
param = sizeof(AudioDeviceID);
err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &param, &fInputDeviceID);
if(err != noErr)
{
fprintf(stderr, "failed to get default input device\n");
return err;
}
err = AudioUnitSetProperty(fAudioUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &fInputDeviceID, sizeof(AudioDeviceID));
if(err != noErr)
{
fprintf(stderr, "failed to set AU input device\n");
return err;
}
callback.inputProc = AudioInputProc;
callback.inputProcRefCon = NULL;
err = AudioUnitSetProperty(fAudioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &callback, sizeof(AURenderCallbackStruct));
param = sizeof(AudioStreamBasicDescription);
err = AudioUnitGetProperty(fAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &fDeviceFormat, &param);
if(err != noErr)
{
printf("failed to get input device ASBD\n");
return err;
}
fDeviceFormat.mSampleRate = 8000.0;
fDeviceFormat.mChannelsPerFrame = 1;
fDeviceFormat.mBitsPerChannel = 16;
fDeviceFormat.mFormatID = kAudioFormatLinearPCM;
fDeviceFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
err = AudioUnitSetProperty(fAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &fDeviceFormat, sizeof(AudioStreamBasicDescription));
if(err != noErr)
{
printf( "failed to set input device ASBD= %4.4s\n",(char *)&err);
if(err == kAudioUnitErr_FormatNotSupported)
{
printf("kAudioUnitErr_FormatNotSupported\n");
}
return err;
}
err = AudioUnitGetProperty(fAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &fDeviceFormat, &param);
if(err != noErr)
{
printf( "failed to get input device ASBD\n");
return err;
}
param = sizeof(UInt32);
err = AudioUnitGetProperty(fAudioUnit, kAudioDevicePropertyBufferFrameSize, kAudioUnitScope_Global, 0, &fAudioSamples, &param);
if(err != noErr)
{
fprintf(stderr, "failed to get audio sample size\n");
return err;
}
err = AudioUnitInitialize(fAudioUnit);
if(err != noErr)
{
fprintf(stderr, "failed to initialize AU\n");
return err;
}

在这里,我无法将采样率和每个样本的位数从 32 更改为 16。请任何人帮助我做到这一点。

感谢和问候。

最佳答案

以支持的格式捕获并将其转换为 8000 kHz,

用上面的代码 AudioUnitSetProperty 将会失败。

您需要使用 AudioConvertNew 创建音频转换器并使用 AudioConverterConvertBuffer 将缓冲区转换为所需格式.

关于macos - Mac OS X 中的音频捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8244132/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com