В проекте Apple, представленном aurioTouch, я слышал, что AudioBufferList ioData в файле AudioController в функции performRender() переносит аудиоданные с микрофона на аудиоплеер? Может ли кто-нибудь подтвердить это? Вот код:Цель AurioTouch AudioBufferList
// Render callback function
static OSStatus performRender (void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
OSStatus err = noErr;
if (*cd.audioChainIsBeingReconstructed == NO)
{
// we are calling AudioUnitRender on the input bus of AURemoteIO
// this will store the audio data captured by the microphone in ioData
err = AudioUnitRender(cd.rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData);
// filter out the DC component of the signal
cd.dcRejectionFilter->ProcessInplace((Float32*) ioData->mBuffers[0].mData, inNumberFrames);
// based on the current display mode, copy the required data to the buffer manager
if (cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeOscilloscopeWaveform)
{
cd.bufferManager->CopyAudioDataToDrawBuffer((Float32*)ioData->mBuffers[0].mData, inNumberFrames);
}
else if ((cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeSpectrum) || (cd.bufferManager->GetDisplayMode() == aurioTouchDisplayModeOscilloscopeFFT))
{
if (cd.bufferManager->NeedsNewFFTData())
cd.bufferManager->CopyAudioDataToFFTInputBuffer((Float32*)ioData->mBuffers[0].mData, inNumberFrames);
}
// mute audio if needed
if (*cd.muteAudio)
{
for (UInt32 i=0; i<ioData->mNumberBuffers; ++i)
memset(ioData->mBuffers[i].mData, 0, ioData->mBuffers[i].mDataByteSize);
}
}
return err;
}
Благодарим вас за такой подробный ответ, который действительно прояснил ситуацию. Это невероятно широкий вопрос, но я действительно борюсь с отправкой микрофонных данных на другой телефон, используя эту инфраструктуру под названием Multipeer Connectivity, и я чувствую себя глубже в аудиоматериалах, поэтому я должен спросить об этом. Я попытался инициализировать NSStream и отправить «iodata» на другой телефон. Хотя он получил данные, он ничего не сделал, что имеет смысл сейчас, потому что я не отправлял ему полные данные микрофона. Мой вопрос в том, как вы будете отправлять поток данных микрофона на другой телефон в режиме реального времени? –
Да очень широкий вопрос. Я не очень разбираюсь в той структуре, которую вы упоминаете. Однако при потоковой передаче вам необходимо адресовать эти вопросы и ограничения: 1) Ограничения полосы пропускания? (например, LAN vs WAN) 2) Является ли ваш протокол сетевой связи надежным или ненадежным (rg tcp vs udp)? Как вы будете обрабатывать потери данных, если они ненадежны? 3) Определите ограничение времени ожидания в реальном времени. (30 мс, 100 мс, 2 секунды?) Нет системы в качестве 0 латентности. 4) Как вы собираетесь сжимать данные? (Opus очень хорош для потоковой передачи с малой задержкой) 5) Вы отправляете данные одному человеку или многим людям? – jaybers
Но я не могу отправить параметры в функцию AudioUnitRender (cd.rioUnit, ioActionFlags, inTimeStamp, 1, inNumberFrames, ioData); на другой телефон, верно? Каким-то образом его нужно превратить в сжатую версию этих данных, а затем отправить. –