IOS Audio Unit에서 PCM 데이터 재생
예제 코드: XBVoiceTool
단계:
1. AVAudioSession 설정 2.오디오 유닛 초기화 3.출력 흐름 형식 설정 4.콜백 설정 5.콜백에서 데이터 제공
AVAudioSession 설정
// session
NSError *error = nil;
AVAudioSession* session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
[session setActive:YES error:nil];
audioUnit 초기화
// audioUnit
AudioComponentDescription outputDesc;
outputDesc.componentType = kAudioUnitType_Output;
outputDesc.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
outputDesc.componentManufacturer = kAudioUnitManufacturer_Apple;
outputDesc.componentFlags = 0;
outputDesc.componentFlagsMask = 0;
AudioComponent outputComponent = AudioComponentFindNext(NULL, &outputDesc);
AudioComponentInstanceNew(outputComponent, &audioUnit);
출력 흐름 형식 설정
//
int mFramesPerPacket = 1;
int mBytesPerFrame = channel * bit / 8;
AudioStreamBasicDescription streamDesc;
streamDesc.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsNonInterleaved;
streamDesc.mFormatID = kAudioFormatLinearPCM;
streamDesc.mSampleRate = rate;
streamDesc.mFramesPerPacket = mFramesPerPacket;
streamDesc.mChannelsPerFrame = channel;
streamDesc.mBitsPerChannel = bit;
streamDesc.mBytesPerFrame = mBytesPerFrame;
streamDesc.mBytesPerPacket = mBytesPerFrame * mFramesPerPacket;
OSStatus status = AudioUnitSetProperty(audioUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
kOutputBus,
&streamDesc,
sizeof(streamDesc));
CheckError(status, "SetProperty StreamFormat failure");
콜백 설정
//
AURenderCallbackStruct outputCallBackStruct;
outputCallBackStruct.inputProc = outputCallBackFun;
outputCallBackStruct.inputProcRefCon = (__bridge void * _Nullable)(self);
status = AudioUnitSetProperty(audioUnit,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Input,
kOutputBus,
&outputCallBackStruct,
sizeof(outputCallBackStruct));
CheckError(status, "SetProperty EnableIO failure");
콜백에서 데이터 제공
여기 플레이어에 설치된bl_input 리셋에서 데이터 제공
static OSStatus outputCallBackFun( void * inRefCon,
AudioUnitRenderActionFlags * ioActionFlags,
const AudioTimeStamp * inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList * __nullable ioData)
{
memset(ioData->mBuffers[0].mData, 0, ioData->mBuffers[0].mDataByteSize);
// memset(ioData->mBuffers[1].mData, 0, ioData->mBuffers[1].mDataByteSize);
XBAudioUnitPlayer *player = (__bridge XBAudioUnitPlayer *)(inRefCon);
if (player.bl_input)
{
player.bl_input(ioData);
}
return noErr;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.