Extended Audio File Services能够看作是对Audio File Services的封装,当时更多的实际开发咱们用它来作音频文件类型的转换。ExtAudioFile具备几下特色:bash
打开文件:数据结构
OSStatus ExtAudioFileOpenURL ( CFURLRef inURL, ExtAudioFileRef _Nullable *outExtAudioFile );
复制代码
当操做完之后,经过Dispose来回收资源,区分于其余的Close:this
OSStatus ExtAudioFileDispose ( ExtAudioFileRef inExtAudioFile );
复制代码
和“Audio ToolBox”的其余属性操做同样,Ext接口提供的属性操做也是分为两步,先获取属性基本信息,如大小:编码
OSStatus ExtAudioFileGetPropertyInfo ( ExtAudioFileRef inExtAudioFile, ExtAudioFilePropertyID inPropertyID, UInt32 *outSize, Boolean *outWritable );
复制代码
而后在得到属性内容:spa
OSStatus ExtAudioFileGetProperty ( ExtAudioFileRef inExtAudioFile, ExtAudioFilePropertyID inPropertyID, UInt32 *ioPropertyDataSize, void *outPropertyData );
复制代码
或者设置属性内容:code
OSStatus ExtAudioFileSetProperty ( ExtAudioFileRef inExtAudioFile, ExtAudioFilePropertyID inPropertyID, UInt32 inPropertyDataSize, const void *inPropertyData );
复制代码
_outputFormat.mSampleRate = 44100;
_outputFormat.mBitsPerChannel = 16;
_outputFormat.mChannelsPerFrame = 2;
_outputFormat.mFormatID = kAudioFormatMPEGLayer3;
UInt32 descSize = sizeof(AudioStreamBasicDescription);
ExtAudioFileGetProperty(_audioFileRef, kExtAudioFileProperty_FileDataFormat, &descSize, &_inputFormat);
_inputFormat.mSampleRate = _outputFormat.mSampleRate;
_inputFormat.mChannelsPerFrame = _outputFormat.mChannelsPerFrame;
_inputFormat.mBytesPerFrame = _inputFormat.mChannelsPerFrame* _inputFormat.mBytesPerFrame;
_inputFormat.mBytesPerPacket = _inputFormat.mFramesPerPacket*_inputFormat.mBytesPerFrame;
ExtAudioFileSetProperty(_audioFileRef,
kExtAudioFileProperty_ClientDataFormat,
sizeof(AudioStreamBasicDescription),
&_inputFormat),
复制代码
kExtAudioFileProperty_Xxxx : 源文件的相关属性,也就是原来什么格式的数据(MP3/AAC),他的基本属性。orm
kExtAudioFileProperty_ClientXxx: 读出时的数据格式,Ext在读出时会自动帮咱们作编解码操做,这个是处理后的结果对象
因此在读取以前,必定要记得设置“kExtAudioFileProperty_ClientDataFormat”属性,设置其输出的数据格式,接口
struct AudioBufferList
{
UInt32 mNumberBuffers;
AudioBuffer mBuffers[1]; // this is a variable length array of mNumberBuffers elements
#if defined(__cplusplus) && CA_STRICT
public:
AudioBufferList() {}
private:
// Copying and assigning a variable length struct is problematic so turn their use into a
// compile time error for eacy spotting.
AudioBufferList(const AudioBufferList&);
AudioBufferList& operator=(const AudioBufferList&);
#endif
};
typedef struct AudioBufferList AudioBufferList;
struct AudioBuffer
{
UInt32 mNumberChannels;
UInt32 mDataByteSize;
void* __nullable mData;
};
typedef struct AudioBuffer AudioBuffer;
复制代码
写入文件内容ip
写入和读取相似,只是要预先填好BufferList的内容:
OSStatus ExtAudioFileWrite ( ExtAudioFileRef inExtAudioFile, UInt32 inNumberFrames, const AudioBufferList *ioData );
复制代码
同时写入还有个非阻塞的版本,当调用“ ExtAudioFileDispose ”会最终保证全部数据都写入到磁盘中。
OSStatus ExtAudioFileWriteAsync ( ExtAudioFileRef inExtAudioFile, UInt32 inNumberFrames, const AudioBufferList *ioData );
复制代码