
我有一个音频单元设置如下.
- (voID) setUpAudioUnit { Osstatus status; AudioComponentInstance audioUnit; AudioComponent inputComponent; AudioComponentDescription audioComponentDescription; AudioStreamBasicDescription audioStreamBasicDescription; // Describe audio component audioComponentDescription.componentType = kAudioUnitType_Output; audioComponentDescription.componentSubType = kAudioUnitSubType_VoiceProcessingIO; audioComponentDescription.componentFlags = 0; audioComponentDescription.componentFlagsMask = 0; audioComponentDescription.componentManufacturer = kAudioUnitManufacturer_Apple; // Get component inputComponent = AudioComponentFindNext(NulL,&audioComponentDescription); // Get audio units status = AudioComponentInstanceNew(inputComponent,&audioUnit); checkStatus(status); // Enable IO for recording UInt32 flag = 1; status = AudioUnitSetProperty(audioUnit,kAudioOutputUnitProperty_EnableIO,kAudioUnitScope_input,kinputBus,&flag,sizeof(flag)); checkStatus(status); // Enable IO for playback status = AudioUnitSetProperty(audioUnit,kAudioUnitScope_Output,kOutputBus,sizeof(flag)); checkStatus(status); // Describe format audioStreamBasicDescription.mSampleRate = AUdio_SAMPLE_RATE; audioStreamBasicDescription.mFormatID = kAudioFormatlinearPCM; audioStreamBasicDescription.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; audioStreamBasicDescription.mFramesPerPacket = AUdio_FRAMES_PER_PACKET; audioStreamBasicDescription.mChannelsPerFrame = AUdio_CHANNELS_PER_FRAME; audioStreamBasicDescription.mBitsPerChannel = AUdio_BITS_PER_CHANNEL; audioStreamBasicDescription.mBytesPerPacket = AUdio_BYTES_PER_PACKET; audioStreamBasicDescription.mBytesPerFrame = AUdio_BYTES_PER_FRAME; // Apply format status = AudioUnitSetProperty(audioUnit,kAudioUnitProperty_StreamFormat,&audioStreamBasicDescription,sizeof(audioStreamBasicDescription)); checkStatus(status); /* Make sure we set the correct audio category before restarting */ UInt32 audiocategory = kAudioSessioncategory_PlayAndRecord; status = AudioSessionSetProperty(kAudioSessionProperty_Audiocategory,sizeof(audiocategory),&audiocategory); checkStatus(status); status = AudioUnitSetProperty(audioUnit,sizeof(audioStreamBasicDescription)); checkStatus(status); // Set input callback AURenderCallbackStruct callbackStruct; callbackStruct.inputProc = recordingCallback; callbackStruct.inputProcRefCon = (__brIDge voID *)(self); status = AudioUnitSetProperty(audioUnit,kAudioOutputUnitProperty_SetinputCallback,kAudioUnitScope_Global,&callbackStruct,sizeof(callbackStruct)); checkStatus(status); // Set output callback callbackStruct.inputProc = playbackCallback; callbackStruct.inputProcRefCon = (__brIDge voID *)(self); status = AudioUnitSetProperty(audioUnit,kAudioUnitProperty_SetRenderCallback,sizeof(callbackStruct)); checkStatus(status); // disable buffer allocation for the recorder (optional - do this if we want to pass in our own) flag = 0; status = AudioUnitSetProperty(audioUnit,kAudioUnitProperty_ShouldAllocateBuffer,sizeof(flag));} 音频设置如下.
kOutputBus 0kinputBus 1AUdio_SAMPLE_RATE 44100AUdio_FRAMES_PER_PACKET 1AUdio_CHANNELS_PER_FRAME 1AUdio_BITS_PER_CHANNEL 16 AUdio_BYTES_PER_PACKET 2AUdio_BYTES_PER_FRAME 2
我正在接收录制回调的PCM数据
audiobufferlist->mBuffers[0].mData
那么,我如何将这个PCM数据从44.1KHz重新采样到8KHz,反之亦然?
我已经Google了很多,但没有找到任何代码示例或直接指令.
找到这些线程,但这些都没有提供明确的指示.
> Which built in AudioUnit can resample audio?
> Changing sample rate of an AUGraph on iOS
任何代码示例或信息都非常受欢迎.
解决方法 转换器音频单元将处理您的采样率转换.我发现解决这个问题的最佳方法是让您的链条适应硬件本身的功能.这意味着您应该获得系统AudioStreamBasicDescription(sysASBD),然后将转换器单元放在系统和链的需要不同的部分之间.因此,对于使用8K sampleRate进行音频播放,您可以这样做:ReomoteIO(mic) – >转换器 – > your8Kprocessing – >转换器 – > RemoteIO(出来).以下是转换器的说明.
AudioComponentDescription convDesc;convDesc.componentType = kAudioUnitType_FormatConverter;convDesc.componentSubType = kAudioUnitSubType_AUConverter;convDesc.componentFlags = 0;convDesc.componentFlagsMask = 0;convDesc.componentManufacturer = kAudioUnitManufacturer_Apple;
以下是如何获得ASBDin和ASBDout系统的方法
UInt32 sizeASBD = sizeof(AudioStreamBasicDescription);AudioStreamBasicDescription ioASBDin;AudioStreamBasicDescription ioASBDout;AudioUnitGetProperty(remoteIO,1,&ioASBDin,&sizeASBD);AudioUnitGetProperty(remoteIO,&ioASBDout,&sizeASBD);
使用转换器所需要做的就是设置输入ASBD并输出ASBD到所需的格式,它完成所有工作.让你的联系和你的8K游戏.
AudioStreamBasicDescription asbd8K;AudioComponentInstance converter44To8;AudioUnitSetProperty(converter44To8,& ioASBDin,sizeof(AudioStreamBasicDescription));AudioUnitSetProperty(converter44To8,&asbd8K,sizeof(AudioStreamBasicDescription));AudioComponentInstance converter8To44;AudioUnitSetProperty(converter8To44,sizeof(AudioStreamBasicDescription));AudioUnitSetProperty(converter8To44,& ioASBDout,sizeof(AudioStreamBasicDescription));总结
以上是内存溢出为你收集整理的c – iOS:如何在运行时使用音频单元重新采样音频(PCM数据)?全部内容,希望文章能够帮你解决c – iOS:如何在运行时使用音频单元重新采样音频(PCM数据)?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)