오디오 캡처 응용 프로그램을 개발 중입니다. 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, ¶m, sizeof(UInt32));
if(err == noErr)
{
param = 0;
err = AudioUnitSetProperty(fAudioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, ¶m, sizeof(UInt32));
}
param = sizeof(AudioDeviceID);
err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, ¶m, &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, ¶m);
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, ¶m);
if(err != noErr)
{
printf("failed to get input device ASBD\n");
return err;
}
param = sizeof(UInt32);
err = AudioUnitGetProperty(fAudioUnit, kAudioDevicePropertyBufferFrameSize, kAudioUnitScope_Global, 0, &fAudioSamples, ¶m);
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)로부터 샘플 당 샘플 속도 및 비트를 변경할 수 없습니다입니다.
감사합니다. & 감사합니다.
마이크에서 오디오를 녹음하거나 다른 응용 프로그램에서 오디오를 캡처 하시겠습니까? – sbooth
마이크에서 오디오를 캡처해야합니다. 빠른 응답에 감사드립니다. –