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 );
複製代碼