首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >远程IO音频噪音很大

远程IO音频噪音很大
EN

Stack Overflow用户
提问于 2011-12-14 15:54:59
回答 1查看 1.3K关注 0票数 1

我刚接触核心音频和远程io。我需要320字节大小的数据,我编码并发送。也至少每秒50帧。以下是我所做的工作:

代码语言:javascript
复制
    AudioComponentDescription desc;

    desc.componentType = kAudioUnitType_Output;
    desc.componentSubType = kAudioUnitSubType_RemoteIO;
    desc.componentFlags = 0;
    desc.componentFlagsMask = 0;
    desc.componentManufacturer = 0;


    // Get component
    AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);

    // Get audio units
    AudioComponentInstanceNew(inputComponent, &audioUnit);

    // Enable IO for recording
    UInt32 flag = 1;                   AudioUnitSetProperty(audioUnit,  kAudioOutputUnitProperty_EnableIO,  kAudioUnitScope_Input,   kInputBus,  &flag,   sizeof(flag));

    // Enable IO for playback     AudioUnitSetProperty(audioUnit,  kAudioOutputUnitProperty_EnableIO,   kAudioUnitScope_Output,   kOutputBus, &flag,   sizeof(flag));

     UInt32 shouldAllocateBuffer = 1;
     AudioUnitSetProperty(audioUnit, kAudioUnitProperty_ShouldAllocateBuffer,      kAudioUnitScope_Global, 1, &shouldAllocateBuffer, sizeof(shouldAllocateBuffer));

    // Describe format
    audioFormat.mSampleRate = 8000.00;
    audioFormat.mFormatID = kAudioFormatLinearPCM;
    audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger|kAudioFormatFlagIsPacked;
    audioFormat.mFramesPerPacket = 1;
    audioFormat.mChannelsPerFrame = 1;
    audioFormat.mBitsPerChannel = 16;
    audioFormat.mBytesPerPacket = 2;
    audioFormat.mBytesPerFrame = 2;


    // Apply format   AudioUnitSetProperty(audioUnit,  kAudioUnitProperty_StreamFormat,  kAudioUnitScope_Output, 1,   &audioFormat,  sizeof(audioFormat));

      AudioUnitSetProperty(audioUnit,  kAudioUnitProperty_StreamFormat,  kAudioUnitScope_Input,  0,  &audioFormat,  sizeof(audioFormat));

    // Set input callback
    AURenderCallbackStruct callbackStruct;
    callbackStruct.inputProc = recordingCallback;
    callbackStruct.inputProcRefCon = self;
        AudioUnitSetProperty(audioUnit,   kAudioOutputUnitProperty_SetInputCallback,   kAudioUnitScope_Global,   1,   &callbackStruct,   sizeof(callbackStruct));



    // Set output callback
    callbackStruct.inputProc = playbackCallback;
    callbackStruct.inputProcRefCon = self;
      AudioUnitSetProperty(audioUnit, kAudioUnitProperty_SetRenderCallback,  kAudioUnitScope_Global,   0, &callbackStruct,  sizeof(callbackStruct));


    // Initialise
    AudioUnitInitialize(audioUnit);

    AudioOutputUnitStart(audioUnit);

有了这个设置,当我尝试使用设备时,我在回调方法中得到了186帧。我已经按缓冲区分配了:

代码语言:javascript
复制
    bufferList = (AudioBufferList*) malloc(sizeof(AudioBufferList));
    bufferList->mNumberBuffers = 1; //mono input
    for(UInt32 i=0;i<bufferList->mNumberBuffers;i++)
    {
          bufferList->mBuffers[i].mNumberChannels = 1;
          bufferList->mBuffers[i].mDataByteSize = 2*186;
          bufferList->mBuffers[i].mData = malloc(bufferList->mBuffers[i].mDataByteSize);
    } 

从回调中的372(2x186)字节中,我获取了320字节的数据,并根据需要使用。它是工作的,但非常嘈杂。

谁来帮帮我。我有大麻烦了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-17 01:15:04

我有几个建议-

使用AVAudioSession类设置

  1. 采样率和缓冲区大小。
  2. 386是一个不寻常的帧数。您的回拨可能要求512或1024。您可以尝试使用环形缓冲区,以允许不同的缓冲区大小/帧速率来满足您的需求。

下面是一些示例:

MixerHost

TimeCode

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8501068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档