リモート IO オーディオ ユニットの使用法を示す 3 ~ 4 の例を見つけました。ここ、ここなど。iPhone のマイクからのアナログ音声データを変換し、デジタル化してから再生します。この時点まではすべて正常に動作しており、Audio Unit についてよく理解できました。
ここで、AudioBufferList に保存されている録音済みのオーディオを同じデバイスで再生するのではなく、別のデバイスにストリーミングしたいと考えています。
以下は、AudioBufferList を nsdata に変換して別のデバイスに送信する方法です。
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObject:@(bufferList->mNumberBuffers) forKey:@"buffersCount"];
NSMutableArray *buffers = [NSMutableArray array];
for ( int i=0; i< bufferList->mNumberBuffers; i++ ) {
NSData *data = [NSData dataWithBytes:bufferList->mBuffers[i].mData length:bufferList->mBuffers[i].mDataByteSize];
NSDictionary *obj = @{@"data":data, @"channels":@(bufferList->mBuffers[i].mNumberChannels)};
[buffers addObject:obj];
}
[dict setValue:buffers forKey:@"buffers"];
NSData *packet = [NSKeyedArchiver archivedDataWithRootObject:dict];
以下は、受信デバイスでnsdataをAudioBufferListに変換し、それをtempBufferにコピーして再生する方法です。
NSDictionary *dict = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:voiceData];
int numberOfBuffers = [dict[@"buffersCount"] intValue];
AudioBufferList *audio = malloc(sizeof(AudioBufferList) + (numberOfBuffers-1)*sizeof(AudioBuffer));
if ( !audio ) {
return;
}
for (int i=0; i < audio->mNumberBuffers; i++) { // in practice we will only ever have 1 buffer, since audio format is mono
AudioBuffer buffer = audio->mBuffers[i];
NSLog(@"Buffer %d has %d channels and wants %d bytes of data.", i, (unsigned int)buffer.mNumberChannels, buffer.mDataByteSize);
// copy temporary buffer data to output buffer
UInt32 size = min(buffer.mDataByteSize, [iosAudio tempBuffer].mDataByteSize); // dont copy more data then we have, or then fits
memcpy(buffer.mData, [iosAudio tempBuffer].mData, size);
buffer.mDataByteSize = size; // indicate how much data we wrote in the buffer
}
しかし、他のデバイスでは何も聞こえません。
何が間違っている可能性があるかについてご案内します。