簡體   English   中英

將遠程IO音頻單元從一台iPhone流傳輸到另一台iPhone

[英]stream Remote IO Audio Unit from one iPhone to another

我發現了3-4個示例,它們顯示了遠程IO音頻單元的用法。 這里這里等。它們會隱藏來自iPhone麥克風的模擬音頻數據,並將其數字化,然后再播放。 到目前為止,一切正常,現在我對音頻單元有了很好的了解。

現在,而不是在同一設備上播放存儲在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
}

但是在另一台設備上,我聽不到任何聲音。

請指導可能有什么問題。

您沒有從字典中檢索任何數據,只是從緩沖區中檢索了一些數據。

    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);
    }

有兩種方法可以打開兩個設備之間的網絡連接。 您想要執行此操作,並以所需的任何格式將數據打包到設備A到設備B中。

從這里開始: http : //nshipster.com/multipeer-connectivity/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM