2014-05-19 6 views
1

원격 IO 오디오 장치의 사용법을 보여주는 3-4 가지 예를 발견했습니다. here, here 등. 그들은 iPhone 마이크에서 아날로그 오디오 데이터를 변환하고 디지털화 한 다음 다시 재생합니다. 이 시점까지는 모든 것이 잘 작동하며 이제 오디오 장치에 대해 잘 알고 있습니다.스트림 한 아이폰에서 다른 아이폰으로 원격 IO 오디오 장치

이제 동일한 장치에서 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]; 

내가 수신 장치에 다시 AudioBufferList에있는 NSData로 변환 한 후 재생 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 
} 

하지만 다른 기기에서는 아무 것도들을 수 없습니다.

무엇이 잘못되었을 수 있는지 안내하십시오.

+0

(NSLog 등) 수신 한 오디오의 개수와 실제 샘플을 검사하고 비교하여 디버깅합니다. 그런 다음 알려진 사인파로 채워서 tempBuffer 재생 루틴을 테스트합니다. – hotpaw2

+0

코드를 디버깅 한 결과 소스에서 보내는 데이터와 대상에서받는 데이터의 차이가 있음을 발견했습니다. NSData가 어떻게 AudioBufferList로 제대로 변환되는지 설명 할 수 있습니까? – iAmd

+0

@iAmd이 문제를 해결 했습니까? – kezi

답변

0

두 장치간에 네트워크 연결을 여는 방법에는 여러 가지가 있습니다. 다만, http://nshipster.com/multipeer-connectivity/

+0

두 장치 사이에 네트워크 연결을 열 수 있고 한 장치에서 다른 장치로 데이터를 보낼 수 있습니다. 내가 달성 할 수없는 것은 다른 장치에서 음성을 재생하는 것입니다. 내 질문을 편집했습니다. 내가 도와 줄 수 있는지 확인해주십시오. – iAmd

1

당신은 사전에서 데이터를 검색하지 않은 :이 작업을 수행하고 단순히 여기 장치 B.

시작에 장치 A에서 그걸 얻기 위해 원하는 어떤 형식으로 데이터를 패키징 할 버퍼의 수

NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
    NSLog(@"%@", dict); 

    int numberOfBuffers = [dict[@"buffersCount"] intValue]; 
    NSLog(@"%d", numberOfBuffers); 

    AudioBufferList *audioBufferList = (AudioBufferList *)malloc(sizeof(AudioBufferList)); 
    if (NULL == audioBufferList) { 
     NSLog(@"*** malloc failure for allocating audioBufferList memory"); 
     return; 
    } 
    audioBufferList->mNumberBuffers = (int)dict[@"buffersCount"]; 

    for(NSDictionary *obj in dict[@"buffers"]){ 
     NSMutableData *data = [NSMutableData dataWithData:obj[@"data"]]; 
     audioBufferList->mBuffers[0].mNumberChannels = (int)obj[@"channels"]; 
     audioBufferList->mBuffers[0].mDataByteSize = (int)[data length]; 
     audioBufferList->mBuffers[0].mData = (AudioBuffer *)malloc([data length]); 

     if (NULL == audioBufferList->mBuffers[0].mData) { 
      NSLog(@"*** malloc failure for allocating mData memory"); 
      return; 
     } 
     memcpy(audioBufferList->mBuffers[0].mData, [data mutableBytes], [data length]); 

     NSLog(@"Buffer has %d channels and wants %d bytes of data.", (unsigned int)audioBufferList->mBuffers[0].mNumberChannels, (unsigned int)audioBufferList->mBuffers[0].mDataByteSize); 
    }