【问题标题】:Make a .caf file out of buffer data从缓冲区数据中创建一个 .caf 文件
【发布时间】:2013-09-10 09:14:04
【问题描述】:

我已将 inBuffer->mAudioData 转换为来自网络的 NSData。我使用音频队列回调来做到这一点。

如何转换此 NSData 以便我可以创建一个 .caf 声音文件或直接将输出提供给另一侧的扬声器?

感谢您的帮助。

编辑 1: 以下是我在发送方用于在 wifi 网络上发送数据的代码:

void AudioInputCallback(void * inUserData,
                    AudioQueueRef inAQ,
                    AudioQueueBufferRef inBuffer,
                    const AudioTimeStamp * inStartTime,
                    UInt32 inNumberPacketDescriptions,
                    const AudioStreamPacketDescription * inPacketDescs)
{
RecordState * recordState = (RecordState*)inUserData;
if (!recordState->recording)
{
    printf("Not recording, returning\n");
}

// if (inNumberPacketDescriptions == 0 && recordState->dataFormat.mBytesPerPacket != 0)
// {
//     inNumberPacketDescriptions = inBuffer->mAudioDataByteSize / recordState->dataFormat.mBytesPerPacket;
// }

printf("Writing buffer %lld\n", recordState->currentPacket);

OSStatus status = AudioFileWritePackets(recordState->audioFile,
                                        false,
                                        inBuffer->mAudioDataByteSize,
                                        inPacketDescs,
                                        recordState->currentPacket,
                                        &inNumberPacketDescriptions,
                                        inBuffer->mAudioData);
NSLog(@"DATA = %@",[NSData dataWithBytes:inBuffer->mAudioData length:inBuffer->mAudioDataByteSize*NUM_BUFFERS]);
[[NSNotificationCenter defaultCenter] postNotificationName:@"Recording" object:[NSData dataWithBytes:inBuffer->mAudioData length:inBuffer->mAudioDataByteSize*NUM_BUFFERS]];

if (status == 0)
{
    recordState->currentPacket += inNumberPacketDescriptions;
}

AudioQueueEnqueueBuffer(recordState->queue, inBuffer, 0, NULL);
}

在这里,我将 inBuffer->mAudioData 转换为 NSData,然后发送到 outputStream。

在接收方的另一端,我使用了以下代码:

-(void)audioMessageData:(NSData *)audioData fromUser:(NSString *)userName {
 NSLog(@"DATA = %@",audioData);
}

每当我获得数据时,都会调用上述函数,并获得从发件人 iPhone 发送的 NSData。现在我想播放我收到的任何音频数据。

感谢您的帮助。

【问题讨论】:

  • 到目前为止,我已经尝试使用 NSHandle 直接在接收器 iPhone 上将 NSData 写入文件,然后使用 Audio Queue 读取文件。但无法阅读。正如您所说的 ExtAudioFile 可以完成这项工作,您能否提供一些代码。我如何实现 ExtAudioFileWrite 方法。感谢您的帮助。
  • 音频是什么格式的?请发布您到目前为止的代码。
  • 请展开“无法阅读”。你如何调用 ExtAudioFileWrite(Async)?你遇到了什么错误?
  • 直到现在我还没有使用 ExtAudioFileWrite。正如你看到的最后一个代码 sn-p 我收到了 audioData。现在我希望在扬声器上播放这个 audioData。我该怎么做?

标签: ios core-audio audio-recording bonjour audioqueueservices


【解决方案1】:

最简单的方法是将音频队列或 RemoteIO 音频单元配置为播放相同格式的数据(原始线性 PCM?)并开始从无锁循环缓冲区中提取样本(播放静音以应对下溢)。然后只需将接收到的数据从 NSData 网络数据包中复制到循环缓冲区中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    相关资源
    最近更新 更多