如果我使用以下客户端数据格式打开带有扩展音频文件服务的音频文件...
AudioStreamBasicDescription audioFormat;
memset(&audioFormat, 0, sizeof(audioFormat));
audioFormat.mSampleRate = 44100.0;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsBigEndian |
kAudioFormatFlagIsSignedInteger |
kAudioFormatFlagIsPacked;
audioFormat.mBytesPerPacket = 4;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 2;
audioFormat.mBytesPerFrame = 4;
audioFormat.mBitsPerChannel = 16;
并像这样配置一个AudioBufferList ....
AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0].mDataByteSize = bufferSize;
bufferList.mBuffers[0].mNumberChannels = audioFormat.mChannelsPerFrame;
bufferList.mBuffers[0].mData = buffer; //malloc(sizeof(UInt8) * 1024 * audioFormat.mBytesPerPacket)
那么,如何在mData中排列数据?如果我像这样迭代数据
for (int i = 0; i < frameCount; i++) {
UInt8 somePieceOfAudioData = buffer[i];
}
那么什么是somePieceOfAudioData。
是样品还是框架(左右通道在一起)?如果它是一个样本,那么它是一个样本的样本?例如,如果它是来自右声道的样本,缓冲区[i + 1]将是左声道的样本吗?
任何想法,链接?谢谢!
答案 0 :(得分:9)
除非设置了kAudioFormatFlagIsNonInterleaved
,否则预计音频数据将被交错。我发现对于Core Audio问题,文档的最佳来源通常是标题。 CoreAudioTypes.h
包含以下注释:
通常,在使用ASBD时,字段会描述 在表示的缓冲区中完整布局样本数据 通过这种描述 - 通常那些缓冲区由表示 一个包含在AudioBufferList中的AudioBuffer。
但是,当ASBD具有kAudioFormatFlagIsNonInterleaved标志时, AudioBufferList具有不同的结构和语义。在这 例如,ASBD字段将描述其中一个的格式 包含在列表中的AudioBuffers,以及每个AudioBuffer 该列表被确定为具有单个(单声道)音频数据通道。 然后,ASBD的mChannelsPerFrame将指示总数 音频缓冲区包含在AudioBufferList中 - 其中 每个缓冲区包含一个通道。这主要用于 AudioUnit(和AudioConverter)表示此列表 - 而不会 可在此结构的AudioHardware用法中找到。
在您的特定情况下,缓冲区将包含从左声道开始的交错短路。
答案 1 :(得分:1)
是的,你正在阅读一个帧,它是两个16位样本,左和右。 (实际上,我不确定哪个是左,哪个是对的。嗯。)
除了头文件之外,Xcode中内置的类引用也很有用。当我整理出这些细节时,我发现我在代码中使用了“选项单击”和“命令单击”。 (对于Xcode新手来说......这些点击分别为您提供信息和文档,以及跳转到源位置。)
即将出版的书籍“学习核心音频:适用于Mac和iOS的音频编程动手指南”,作者Kevin Avila和Chris Adamson在解释这一切是如何工作方面做得很好。它现在可以在Safari Books Online以“Rough Cut”形式获得: