870920 Menu

AudioFormatReader类系详解

AudioFormatReader是一个抽象基类,无需也无法创建此类的对象。该类相当于一个保存了音频文件或音频CD数据的指针。更简单的描述:各种格式的音频文件通过AudioFormat类将有关数据转交给AudioFormatReader,供下一个音频处理环节使用(比如AudioSource)。

实际编程时,一般不直接与AudioFormat打交道,而是通过AudioFormatManager类的有关函数直接返回AudioFormatReader指针。AudioFormatManager类在内部处理时将使用合适的AudioFormat来创建本类指针,这些内部细节无需关心。并且也很少用本类对象完成具体的工作,往往只是需要一个本类指针就足矣(偶尔会用到本类的public成员数据,以获取当前音频文件的各类信息)。

AudioFormatReader类的public数据成员
 sampleRate 音频数据的采样率,double类型
 bitsPerSample 采样精度。比如:16, 24, 32。无符号整型
 lengthInSamples 音频数据的采样值总数。int64类型
 numChannels 音频数据的通道数。无符号整型
 usesFloatingPointData 使用浮点数据, 还是定点数据。bool型
 metadataValues 音频数据中的元数据集合。StringPairArray类型
 input 输入流, 供子类使用。InputStream指针

AudioFormatReader类的成员函数
 getFormatName () 返回所代表的音频数据的格式描述
 read () 从数据流中读取采样,保存到本函数的1参中
 readMaxLevels () 查找音频数据中的最高和最低采样值
 searchForLevel () 查找音频数据中某个范围内第一个满足条件的采样值的位置
 readSamples () 底层读取操作。纯虚函数,派生类须实现之

AudioFormatReader有四个派生类,一是专用于读取音频CD数据的AudioCDReader,二是专用于读取音频文件中某个部分的AudioSubsectionReader,三是MemoryMappedAudioFormatReader,该类类似于AudioSubsectionReader,但性能更好,可将整个音频文件或音频文件的某一部分映射到内存中,以加快读取速度。四是BufferingAudioReader类,该类可使用后台线程对其他Reader进行预读取。

AudioCDReader
可读取音频CD,获取其音频数据。音频CD的逻辑结构为:每首乐曲以音轨的形式顺序存放于CD的磁道中。需注意:音频CD中可包含并非音频的普通数据,这些数据同样采用音轨的形式。

AudioCDReader在读取音频CD时,将整个CD视为一个大型的数据流。可调用getPositionOfTrackStart()函数获取所需的某条音轨。

本类无法直接创建对象,需使用静态函数返回本类的指针。两个静态函数为:
 getAvailableCDNames () 返回当前可用于读取的音频CD的设备列表
 createReaderForCD () 基于给出的索引返回本类的指针,以用来读取CD数据

AudioCDReader类的成员函数:(网站发布,略)

与专门读取音频CD的AudioCDReader类相对应,JUCE类库还提供了专用于刻录音频CD的AudioCDBurner类。该类继承自ChangeBroadcaster,刻录期间可产生可变消息。捕获并处理此消息的类为该类的嵌套类(抽象基类)AudioCDBurner::BurnProgressListener,其纯虚函数为audioCDBurnProgress (flaot),可在此获取其参数值,该值代表当前的刻录进度。该函数返回bool值,如果返回true,则取消刻录。

AudioCDBurner的功能较具体而单纯,其用法和AudioCDReader如出一辙,不再详述。

AudioSubsectionReader
AudioSubsectionReader为AudioFormatReader的另一个派生类,用于读取音频文件中的一段内容。该类内部封装了一个代表音频文件的AudioFormatReader指针(组合到本类,成为本类数据成员),假设该对象所读取的音频文件有1000个采样,那么可用本类对象读取第100个采样到第200个采样之间的内容。即:本类代表某个音频文件中的某一范围内的音频数据。任何超出此范围的数据(采样值),均按0值处理。其他模块读取到本类的0值采样时,自动跳转到本类另一个对象的第一个非零采样,从该对象的第一个采样继续读取,而该对象所持有的音频数据也许是同一个音频文件中的第500到第800个采样。

AudioSubsectionReader类的构造函数:
 AudioSubsectionReader(AudioFormatReader*, // 读取并持有该对象中的一部分数据
int64 第几个采样, // 从1参中的该位置读取采样。该位置处的采样由本类内部置为0值
int64 subsectionLength, // 读取1参中的多少个采样
bool deleteSourceWhenDeleted) // 是否托管1参

AudioSubsectionReader类的成员函数
 readMaxLevels () 查找音频数据中的最高和最低采样值
 readSamples () 底层读取操作

在进行多轨录音、混缩合成和音视频非编软件的设计开发时,本类(或使用本类的自定义类)将大展身手。

MemoryMappedAudioFormatReader
AudioFormatReader 的特殊类型,本类使用MemoryMappedFile对象直接读取磁盘中的音频文件,可将该文件的某个部分或全部数据映射到内存中,以加快读取速度,提高性能。注意两点:
一、本类并不支持所有的音频格式。
二、使用本类对象读取采样数据之前,必须首先调用mapEntireFile()或mapSectionOfFile(),以确保所要读取的数据已正确映射到内存中。

MemoryMappedAudioFormatReader类的构造函数protected,无需也无法显式创建本类对象。新增的成员函数有:(网站发布,略)