簡體   English   中英

Mac OS X中的音頻捕獲

[英]Audio capture in Mac OS X

我正在開發一個音頻捕獲應用程序。 如何使用Audio Unit API使用單個chanel以8 kHz采樣率在Mac OS X上捕獲音頻?

這是我試過的代碼。

    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

我有類似的問題,我不得不修改沙箱權限。 檢查您的應用程序是否裝有沙盒,您可以訪問麥克風。

您應該查看SoundFlower源代碼 這可能有助於指出你正確的方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM