c – iOS:如何在运行时使用音频单元重新采样音频(PCM数据)?

c – iOS:如何在运行时使用音频单元重新采样音频(PCM数据)?,第1张

概述如何在运行时/现场使用音频单元重新采样音频(PCM数据)? 我有一个音频单元设置如下. - (void) setUpAudioUnit { OSStatus status; AudioComponentInstance audioUnit; AudioComponent inputComponent; AudioComponentDescription audioC 如何在运行时/现场使用音频单元重新采样音频(PCM数据)?

我有一个音频单元设置如下.

- (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数据)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1227836.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存