Я бы хотел «перехватить» аудиоданные на пути к динамику устройства 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.