iOS 自定义构建填充 AVAudioPCMBuffer 您所在的位置:网站首页 audioconverter怎么读 iOS 自定义构建填充 AVAudioPCMBuffer

iOS 自定义构建填充 AVAudioPCMBuffer

2023-11-28 12:34| 来源: 网络整理| 查看: 265

本文部分内容翻译自 Apple 官方开发者论坛中来自Apple开发者的一份声明,Working with AVAudioPCMBuffer

背景

AVAudioBuffer 是苹果最新音频框架 AVFAudio(即 AVFoundation Audio 部分)中最基础的音频缓存帧结构

但是目前该结构仅能在 AVAudioEngine 的整体使用中由 AVAudioFile 的 readIntoBuffer:frameCount:error: 方法读出,没有自定义构建并填充数据的途径。

因此 Apple 官方开发人员对此做出了回应并给出了一些建议

构建帧结构

一些开发者有问过怎样不通过 AVAudioFile 的读解码方法 readIntoBuffer… 创建 AVAudioPCMBuffer 并填充数据。

AVAudioPCMBuffer 是 AVAudioBuffer 在 PCM 格式下的子类。对 Core Audio 有所了解的人会注意到,基本上这些缓存类设计都会把 AudioStreamBasicDescription(AVAudioFormat中)和 AudioBufferList/AudioBuffer 结构包装进来。

因为在为 AudioBufferList/AudioBuffer(s) 分配内存时,需要知道具体的格式和缓存大小,所以在创建 AVAudioPCMBuffer 实例时,需要指定缓存格式。缓存中可以存储的最大帧数通过只读属性 frameCapacity 限定,它的注释是:“缓存中音频采样帧的容量(只读)”

frameLength 属性表示缓存中当前可用帧数量,这个数量可能会被修改,特别是直接操作底层 AudioBuffers 的时候。这个数量值不能超过缓存容量值。修改这个数量属性时,底层 AudioBuffers 里的 mDataByteSize 字段会相应被更新。

AVAudioPCMBuffer 为访问容器中的音频数据提供了三个属性:

floatChannelData:返回一个 32-bit float 的音频采样数据指针。如果不是该格式,则返回 nilint16ChannelData:返回一个 2-byte int 的音频采样数据指针。如果不是该格式,则返回 nilint32ChannelData:返回一个 4-byte int 的音频采样数据指针。如果不是该格式,则返回 nil

此外, AVAudioBuffer 类提供了两个可以直接访问底层 AudioBufferList 结构数据的属性:

audioBufferList:AudioBufferList 结构的不可变版本,但是可以修改内部的缓存内容。其 mDataByteSize 字段表示当前的帧数量 frameLengthmutableAudioBufferList:AudioBufferList 结构的可变版本在允许修改内部缓存内容的同时,也可以修改结构本身。其 mDataByteSize 字段表示当前的帧容量 frameCapacity,如果这个值被改变了,需要同时匹配修改 frameLength。Core Audio 和 AutioToolBox 中有些底层API,如 AudioConverterCnvertComplexBuffer 需要传入一个可变的 AudioBufferList

以下这个例子简单演示了怎么创建一个浮点格式的 AVAudioPCMBuffer 并初始化缓存区:

// 双声道配置 AVAudioChannelLayout *chLayout = [[AVAudioChannelLayout alloc] initWithLayoutTag:kAudioChannelLayoutTag_Stereo]; AVAudioFormat *chFormat = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32 sampleRate:44100.0 interleaved:NO channelLayout:chLayout]; // 创建一个基于上述配置的帧缓存结构 AVAudioPCMBuffer *thePCMBuffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:chFormat frameCapacity:1024]; thePCMBuffer.frameLength = thePCMBuffer.frameCapacity; // 初始化数据区 for (AVAudioChannelCount ch = 0; ch


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有