iOS音頻播放(四)ExtAudioFile文件讀取

Extended Audio File Services能夠看作是對Audio File Services的封裝,當時更多的實際開發咱們用它來作音頻文件類型的轉換。ExtAudioFile具備幾下特色:bash

  • 一、ExtAudioFile 是AudioUnit的一個組件,它提供了將原始音頻數據編碼爲WAV,caff等編碼格式的音頻數據,同時提供寫入文件的接口
  • 二、同時它還提供了從文件中讀取數據解碼爲PCM音頻數據的功能
  • 三、編碼和解碼支持硬編解碼和軟編解碼
  • 四、不能操做PCM裸數據
  • 五、對應的數據結構對象爲 ExtAudioFileRef
  • 六、該對象具備編碼和封裝兩大功能

打開和關閉音頻數據

打開文件:數據結構

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 );
複製代碼
相關文章
相關標籤/搜索