从缓冲区数据中创建一个 .caf 文件

Posted

技术标签:

【中文标题】从缓冲区数据中创建一个 .caf 文件【英文标题】:Make a .caf file out of buffer data 【发布时间】: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。我该怎么做? How to get array of float audio data from AudioQueueRef in iOS?的可能重复 【参考方案1】:

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

【讨论】:

以上是关于从缓冲区数据中创建一个 .caf 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 的后台线程中创建 BitmapImage 缓冲区? [复制]

使用传入的参数在 C++ 中创建 3D 数组

在 C++ 中创建一个 zip 存档

在实验室颜色空间中创建像素缓冲区

Hive 协议缓冲区 - 在 Hive 中创建表时出现 NullPointerException

如何在 Linux 中创建原始套接字而不缓冲接收数据包?是不是可以?