Удаленный звук IO очень шумный - PullRequest
1 голос
/ 14 декабря 2011

Я новичок в ядре аудио и удаленного ввода-вывода. Мне нужны данные размером 320 байт, которые я кодирую и отправляю. Также минимум 50 кадров в секунду. Вот что я сделал:

    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 кадров в методе обратного вызова при попытке с устройством. Я выделил по буферу:

    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 (2 x 186) байтов в обратном вызове я взял 320-байтовые данные и использовал их согласно моему требованию. Работает, но очень шумно.

Кто-нибудь, пожалуйста, помогите мне. У меня большие проблемы.

1 Ответ

1 голос
/ 16 декабря 2011

Пара предложений -

  1. Частота дискретизации и размер буфера устанавливаются с помощью класса AVAudioSession.
  2. 386 - необычное количество кадров. Ваш обратный вызов, вероятно, запрашивает 512 или 1024. Вы можете попробовать использовать кольцевой буфер, чтобы позволить варьировать размер буфера / частоту кадров в зависимости от ваших потребностей.

Вот несколько примеров:

MixerHost
TimeCode

...