870920 Menu

JUCE音频之AudioFormat类群

本小节主要详解以下类:

  • AudioFormat类系 代表某个具体的音频格式,其成员函数createReaderFor()可生成输入流对象,供AudioFormatReader读取;createWriterFor()可生成输出流对象,供AudioFormatWriter写入
  • AudioFormatReader类系 读取AudioFormat所生成的音频数据
  • AudioFormatWriter 将音频数据写入到AudioFormat所生成的输出流对象中
  • AudioFormatManager 注册音频格式,直接返回用于读取某个音频文件的AudioFormatReader

整个AudioFormat类群的作用简而言之:
 注册音频格式,读取音频文件。
 读取的数据供AudioSource或AudioIODeviceCallback等音频环节所用。
 将程序内部的音频数据写入磁盘文件中。

AudioFormat
AudioFormat是一个无父类的抽象基类,其派生类用于读写各类音频格式(音频文件)。JUCE默认可读取的音频格式有8大类,可写入(生成)的音频格式有5大类(程序员通过自定义派生类,可支持读写更多的音频格式)。类库原生所支持的音频格式(AudioFormat的各个派生类)见下:

 AudioFormat

  • AiffAudioFormat 可读写
  • CoreAudioFormat 可读写
  • FlacAudioFormat 可读写
  • OggVorbisAudioFormat 可读写
  • WavAudioFormat 可读写
  • MP3AudioFormat 可读不可写
  • LAMEEncoderAudioFormat 可写不可读
  • QuickTimeAudioFormat 可读不可写
  • WindowsMediaAudioFormat 可读不可写
表 3 12 AudioFormat及其派生类继承图示

AudioFormat的非纯虚成员函数:
 getFormatName () 返回此格式的文本描述
 getFileExtensions () 返回支持此格式的音频文件的所有扩展名
 canHandleFile (File对象) 如果给出的文件可按此格式进行读取,则返回true
 isCompressed () 如果此格式进行了音频压缩, 则返回true
 getQualityOptions () 返回写入时可使用的品质等级(返回值为StringArray)
 createMemoryMappedReader() 基于给出的文件,创建其内存映射式AudioFormatReader

AudioFormat的纯虚函数:
 getPossibleSampleRates () 返回此格式可读写的采样率集合
 getPossibleBitDepths () 返回此格式可读写的采样精度集合
 canDoStereo () 如果此格式可处理双通道音频, 则返回true
 canDoMono () 如果此格式可处理单通道音频, 则返回true
 createReaderFor (InputStream指针, 是否托管1参)
将输入流的音频数据“转交”给本函数的返回值AudioFormatReader
 createWriterFor (OutputStream指针, 采样率, 通道数, 采样精度, 元数据, 压缩等级) 创建AudioFormatWrite对象,该对象可将数据以此格式写入流中

上面最后两个纯虚函数,是整个AudioFormat类系最重要的功能性函数,一个用于读某种格式的音频文件,一个用于写某种格式的音频文件。下面逐个看看AudioFormat的派生类(AudioFormat的所有派生类均无子类,构造函数无参。除特别注明者之外,均没有增加新的成员函数):

 AiffAudioFormat:专用于读写AIFF格式的音频文件。

 CoreAudioFormat:专用于读写OSX下的音频文件。

 FlacAudioFormat:专用于读写FLAC无损压缩格式的音频文件。

 OggVorbisAudioFormat:专用于读写Ogg-Vorbis格式的音频文件。该类新增了一个成员函数:estimateOggFileQuality (File对象) 估算该ogg文件的品质等级

 WavAudioFormat:专用于读写WAV格式的音频文件。该类新增1个成员函数和多个public成员:replaceMetadataInFile (File&,  StringPairArray&) 用2参替换1参WAV文件中的元数据

WavAudioFormat类新增的静态函数
 createBWAVMetadata () 创建BWAV文件的元数据,返回StringPairArray栈对象

WavAudioFormat类新增的静态数据成员为各类元数据,其类型全部为static const char* const(指向字符常量的常指针)

MP3AudioFormat、QuickTimeAudioFormat、WindowsMediaAudioFormat这三个派生类,由于专利、平台相关等因素,只能读取对应格式的音频文件,无法写入,其createWriterFor()函数的返回值为nullptr。且均没有增加新的成员函数。如需写入,可自行派生子类(与这些类平级)。

通常无需显式创建AudioFormat各派生类的对象,而是供AudioFormatManager类内部使用。但是,有必要了解AudioFormat类系的核心函数createReaderFor()和createWriterFor()。这两个函数的返回值分别是:用于读音频文件的AudioFormatReader和用于写音频文件的AudioFormatWriter的堆对象(指针),后文将详解这两个类。