【问题标题】:stream Remote IO Audio Unit from one iPhone to another将远程 IO 音频单元从一部 iPhone 流式传输到另一部
【发布时间】:2014-05-19 11:44:19
【问题描述】:

我发现了 3-4 个示例,这些示例显示了远程 IO 音频单元的用法。像herehere 等。他们从 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
}

但在其他设备上我什么也听不见。

请指导可能出现的问题。

【问题讨论】:

  • 通过检查和比较发送的音频的计数和实际样本与接收的音频样本(NSLog 或其他)进行调试。然后用已知的正弦波填充 tempBuffer 播放程序来测试它。
  • 我已经调试了代码,发现我从源发送的数据和我在目的地接收的数据存在差异。你能解释一下 NSData 是如何正确转换回 AudioBufferList 的吗?
  • @iAmd 你解决过这个问题吗?

标签: ios iphone core-audio audiounit audiobufferlist


【解决方案1】:

您没有从字典中检索任何数据,只是缓冲区的数量。

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

【讨论】:

    【解决方案2】:

    有多种方法可以在两台设备之间打开网络连接。您想这样做,只需将数据以您希望从设备 A 获取到设备 B 的任何格式打包。

    从这里开始:http://nshipster.com/multipeer-connectivity/

    【讨论】:

    • 我能够打开两台设备之间的网络连接,并将数据从一台设备发送到另一台设备。我无法实现的是在另一台设备上播放语音。我已经编辑了我的问题。请看看我是否可以得到帮助。
    猜你喜欢
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多