从缓冲区数据中创建一个 .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 缓冲区? [复制]