Содержимое AudioBufferList в обратном вызове воспроизведения аудиоустройства RemoteIO - PullRequest
3 голосов
/ 16 ноября 2011

Я бы хотел «перехватить» аудиоданные на пути к динамику устройства iOS. Я считаю, что это можно сделать с помощью удаленных аудиоустройств и обратных вызовов. В нижеприведенном воспроизведении Воспроизведение ioData действительно содержит какие-либо аудиоданные?

static OSStatus playbackCallback(void *inRefCon, 
                                 AudioUnitRenderActionFlags *ioActionFlags, 
                                 const AudioTimeStamp *inTimeStamp, 
                                 UInt32 inBusNumber, 
                                 UInt32 inNumberFrames, 
                                 AudioBufferList *ioData) { ... } 

Я в замешательстве, потому что при регистрации информации о ioData подразумевается, что она содержит аудиоданные ...

// if (ioData->mNumberBuffers > 0)
AudioBuffer buffer = ioData->mBuffers[0];
NSLog(@"buffer.mNumberChannels: %ld", buffer.mNumberChannels); // prints 2
NSLog(@"buffer.mDataByteSize  : %ld", buffer.mDataByteSize); // prints 4096

Однако создание CMSampleBufferRef из содержимого ioData и запись его в CoreAudioFile с использованием AVAssetWriter приводит к созданию файла без вывода сообщений. Длина выходного файла кажется хорошей (несколько секунд), но, например, при открытии файла в Audacity отображается плоская линия.

После прочтения многочисленных SO-сообщений и экспериментов с большим количеством примеров кода удаленного аудиоустройства я начинаю задумываться, не содержит ли приведенная выше ioData буферы предварительно заданного размера, но пустые, которые должны быть заполнены в PlayCallback.

1 Ответ

6 голосов
/ 17 ноября 2011

Буферы ioData в playCallback - это место, где обратный вызов должен помещать аудиосэмплы, которые вы хотите воспроизвести. Буферы не содержат другой звук, перехваченный на пути к динамику.

...