【问题标题】:How do I read samples from an AudioBufferList?如何从 AudioBufferList 中读取样本?
【发布时间】:2012-01-13 20:59:02
【问题描述】:

如果我使用以下客户端数据格式打开具有扩展音频文件服务的音频文件...

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 是什么。

是样本还是帧(左右声道一起)?如果它是一个样本,那么它是哪个频道的样本?例如,如果它是来自右通道的样本,那么 buffer[i + 1] 是否会成为左通道的样本?

任何想法,链接?谢谢!

【问题讨论】:

  • “缓冲区可以表示两种不同类型的音频...单个、单声道、非交错的音频通道 [或] 具有任意数量通道的交错音频 — 由 mNumberChannels 字段指定”。我想现在的问题是我怎么知道哪个是哪个,我应该使用多个音频缓冲区吗?例如bufferList.mNumberBuffers = audioFormat.mChannelsPerFrame

标签: objective-c ios core-audio


【解决方案1】:

除非设置了kAudioFormatFlagIsNonInterleaved,否则音频数据应该是交错的。我发现对于 Core Audio 问题,最好的文档来源通常是标题。 CoreAudioTypes.h 包含以下评论:

通常,当使用 ASBD 时,字段描述 表示的缓冲区中样本数据的完整布局 通过这个描述 - 通常这些缓冲区由 包含在 AudioBufferList 中的 AudioBuffer。

但是,当 ASBD 具有 kAudioFormatFlagIsNonInterleaved 标志时, AudioBufferList 具有不同的结构和语义。在这个 在这种情况下,ASBD 字段将描述 ONE 的格式 列表中包含的 AudioBuffers,以及中的每个 AudioBuffer 该列表被确定为具有单个(单声道)音频数据通道。 然后,ASBD 的 mChannelsPerFrame 将指示总数 AudioBufferList 中包含的 AudioBuffers - 其中 每个缓冲区包含一个通道。这主要用于 此列表的 AudioUnit(和 AudioConverter)表示 - 并且不会 在 AudioHardware 的使用中可以找到这个结构。

在您的特定情况下,缓冲区将由从左通道开始的交错短路组成。

【讨论】:

  • 谢谢,是的,头文件非常有帮助。我什至发现了一些新可用于 iOS 的未记录音频单元!
【解决方案2】:

是的,您正在读取一个帧,它是两个 16 位样本,左和右。 (其实我并不确定哪个是左哪个是右。嗯。)

除了头文件之外,Xcode 中内置的类引用也很有帮助。当我整理这些细节时,我发现我在代码中经常使用“option-click”和“command-click”。 (对于那些刚接触 Xcode 的人......这些点击分别为您提供信息和文档,以及跳转到源位置。)

Kevin Avila 和 Chris Adamson 即将出版的“Learning Core Audio: A Hands-on Guide to Audio Programming for Mac and iOS”一书很好地解释了这一切是如何工作的。 Safari Books Online 现在以“粗剪”形式提供:

http://my.safaribooksonline.com/book/audio/9780321636973

【讨论】:

  • 谢谢!我会支持所有这些。我已经阅读了那本书,它很有帮助!头文件也很有帮助,但通常在哪里查找并不明显。例如,在这种情况下,我会查找 AudioStreamBasicDescription、AudioBuffer 或 ExtAudioFileRead。不过我最终还是找到了答案。
猜你喜欢
  • 2018-12-02
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多