2011-11-23 2 views
0

오디오 캡처 응용 프로그램을 개발 중입니다. Audio Unit API를 사용하여 단일 채널로 8kHz 샘플링 속도를 사용하여 Mac OS X에서 오디오를 캡처하는 방법은 무엇입니까?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; 
} 

여기에 나는 어떤 사람이 나에게이 일을 도와주세요 (16) (32)로부터 샘플 당 샘플 속도 및 비트를 변경할 수 없습니다입니다.

감사합니다. & 감사합니다.

+0

마이크에서 오디오를 녹음하거나 다른 응용 프로그램에서 오디오를 캡처 하시겠습니까? – sbooth

+0

마이크에서 오디오를 캡처해야합니다. 빠른 응답에 감사드립니다. –

답변

0

source code for SoundFlower을 확인해야합니다. 그것은 올바른 방향으로 당신을 가리키는 데 도움이 될 수 있습니다.

2

지원되는 형식으로 캡처하고 8000 kHz로 변환, 위의 코드AudioUnitSetProperty

실패 할 것입니다.

AudioConvertNew을 사용하여 오디오 변환기를 만들고 AudioConverterConvertBuffer을 사용하여 원하는 형식으로 버퍼를 변환해야합니다.

+1

AudioConverterConvertBuffer 대신 AudioConverterFillComplexBuffer를 사용하셨습니까? – user523234

0

비슷한 문제가있어서 모래 상자 권한을 수정해야했습니다. 귀하의 응용 프로그램이 샌드 박스로되어 있는지 확인하십시오, 당신은 마이크에 액세스 할 수 있습니다.