在開發(fā)直播APP的時候,用到了AudioToolbox.framework框架。。 在這里做一個總結,分享給大家
AudioFileStream類,提供了一個接口,用來解析一個流音頻文件
創(chuàng)建一個 new stream parse

//aquire some data
AudioFileStreamParseBytes(<#AudioFileStreamID inAudioFileStream#>, <#UInt32 inDataByteSize#>, <#const void *inData#>, <#UInt32 inFlags#>);
//設置從流文件中讀取data時的offset
AudioFileStreamSeek(<#AudioFileStreamID inAudioFileStream#>, <#SInt64 inPacketOffset#>, <#SInt64 *outDataByteOffset#>, <#UInt32 *ioFlags#>);
//獲取完數(shù)據(jù)后,關閉該流對象
AudioFileClose(<#AudioFileID inAudioFile#>)
AudioServices
AudioQueue
使用一個緩沖隊列來存儲data,用來播放或錄音。播放或錄音的時候,數(shù)據(jù)以流的形式操作,可以邊獲取數(shù)據(jù)變播放,或者邊錄音,邊存儲。
-------------------------------------------------------------------------
NSFileHandle 用來從文件、socket中讀取數(shù)據(jù)
CFReadStream 用來讀取一個字節(jié)流byte stream,該字節(jié)流可以來自于內存、一個文件、一個socket。在讀bytes之前,流stream需要被打開。
CFWriteStream用來寫一個字節(jié)流
AudioQueueRef? 定義的一個不透明的數(shù)據(jù)類型,專門用來代表一個audio queue
AudioQueueBufferRef 是AudioQueueBuffer的別名,表明該參數(shù)為一個AudioQueueBuffer對象
AudioFileID 定義一個不透明的數(shù)據(jù)類型,代表一個audiofile的對象
反思:以ref結尾的對象名稱,一般是在參數(shù)中使用,表明這個參數(shù)的數(shù)據(jù)類型
//===============
AudioStreamBasicDescription
音頻數(shù)據(jù)流格式的描述.Callback Method 回調函數(shù),系統(tǒng)規(guī)定好了回調函數(shù)的參數(shù),以及調用的地方,你只需要保證參數(shù)的格式正確,向函數(shù)里添加代碼即可,函數(shù)的方法名稱可以隨便寫,沒有強制的規(guī)定。
AudioQueueNewOutput的第三個參數(shù):inUserData 這是由用戶來自定義的,數(shù)據(jù)的來源。只需要傳遞一個對象進去即可。使用,當系統(tǒng)自動調用回調函數(shù)MyAudioQueueOutputCallback或者MyAudioQueueInputCallback時候,返回的第一個參數(shù)inUserData就是你在AudioQueueNewOutput中設置的第三個參數(shù)。然后,你需要在回調函數(shù)中使用這個對象填充buffer(播放音頻,當一個buffer為空時自動調用)或者讀取buffer的數(shù)據(jù)(錄音,當一個buffer滿時自動調用)。
AudioFileStream_PropertyListenerProc
當在audio stream中找到一個property value后,回調該方法。
AudioFileStream_PacketsProc當在stream中找到audio data后回調該方法。
在參數(shù)中的in和out個代表的意思:in代表的是這個參數(shù)需要你在外面得到然后傳遞進去,在這個方法中要使用;out開頭的參數(shù)表示這個參數(shù)是這個方法返回的值,你一般只需要定義一個引用,然后傳遞進去,執(zhí)行完這個方法后,這個參數(shù)就實例化了。oh,my god!坑爹的蘋果。
AudioFile類
一個c編程接口,使用AudioFile可以從內存或硬盤中讀取或寫入多種格式的音頻數(shù)據(jù)。
AudioFileStream類
提供了一個借口,用來解析流音頻文件。功能:從網(wǎng)絡中讀取數(shù)據(jù)流,把數(shù)據(jù)流解析成音頻文件。
音頻文件流是不容易獲取的。當需要從stream中讀取data時,以前的data可能已無法使用,而新的data還沒有到達,而從網(wǎng)絡中獲取的data可能還包含packets數(shù)據(jù)。為了解析audio stream,parser必須記著已經獲取的數(shù)據(jù),等待剩余的數(shù)據(jù)。
緩沖區(qū)是在哪設置的?
AudioQueue類
一個c編程接口,是Core Audio的一部分。功能:錄音、播放音頻。
AudioQueue類播放音頻時,在內存中維護著一個buffer queue。只要buffer中有數(shù)據(jù)就可以播放,因此,一般使用AudioQueue對象來播放音頻流,這樣可以“邊下載邊播放”。
播放音頻的方法:
AudioQueueNewOutput
1、用來創(chuàng)建一個播放音頻隊列的對象AudioQueueRef,然后就是對該audioqueue對象進行操作。
2、用來添加一個回調方法AudioQueueOutputCallback,調用該方法時會返回一個audioqueue的buffer,該buffer中的數(shù)據(jù)已經被使用,需要在這個方法中填充新數(shù)據(jù)。
3、
AudioQueueEnqueueBuffer
想緩沖區(qū)中添加新的數(shù)據(jù)(數(shù)據(jù)一般從file或網(wǎng)絡中獲?。?/p>
//====下載=====
CFReadStream
CFReadStreamClientCallBack回調函數(shù)在CFReadStreamSetClient中調用,是第三個參數(shù)。CFReadStreamClientCallBack只有在滿足CFReadStreamSetClient中添加的streamEvents發(fā)生時才會別回調。
CFReadStreamScheduleWithRunLoop方法把stream加到一個線程中。然后,CFReadStreamSetClient在設置的東西就起作用了。當各種streamEvent發(fā)生時,client都會得到通知,client判斷是否執(zhí)行回調方法CFReadStreamClientCallBack。
AudioSession類
一個c接口,用來管理應用中audio的行為。
線程的操作,暫停后可能是縣城就停止了。
對線程的操作? 讓某一個線程停下來。
AudioQueue
一個c編程接口,是Core Audio的一部分。功能:錄音、播放音頻。
AudioQueue類播放音頻時,在內存中維護著一個buffer queue。只要buffer中有數(shù)據(jù)就可以播放,因此,一般使用AudioQueue對象來播放音頻流,這樣可以“邊下載邊播放”。
audioqueue中的方法都是靜態(tài)方法,使用時傳遞進去的參數(shù)前綴是in,傳遞出來的參數(shù)前綴是out播放音頻的方法:
AudioQueueNewOutput
1、用來創(chuàng)建一個播放音頻隊列的對象AudioQueueRef,然后就是對該audioqueue對象進行操作。
2、用來添加一個回調方法AudioQueueOutputCallback,調用該方法時會返回一個audioqueue的buffer,該buffer中的數(shù)據(jù)已經被使用,需要在這個方法中填充新數(shù)據(jù)。
3、
AudioQueueEnqueueBuffer
想緩沖區(qū)中添加新的數(shù)據(jù)(數(shù)據(jù)一般從file或網(wǎng)絡中獲?。?/p>
AudioQueueAllocateBuffer
為一個audioqueue分配一個queueBuffer,每調用一次創(chuàng)建一個緩沖區(qū),最后所有的緩沖區(qū)組成一個緩沖隊列。
AudioQueueCreateTimeline
創(chuàng)建一個與audioqueue相關的時間軸。如果想要顯示audio的時間,需要熟悉uyutimeLine相關的方法。
audioqueue的屬性操作:
具體屬性類型見官方文檔:https://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/AudioQueueReference/Reference/reference.html#//apple_ref/c/func/AudioQueueAddPropertyListener
AudioQueueSetProperty
用來設置某一個audioqueue對象的屬性,具體屬性以 kAudioQueueProperty_*開頭
AudioQueueGetProperty
獲取audioqueue對象的某一個屬性值。首先應該先調用AudioQueueGetPropertySize方法獲取value的大小(byte形式)
AudioQueueAddPropertyListener
添加一個屬性監(jiān)聽器。當一個audioqueue的對應屬性值改變時,會回調這個監(jiān)聽器。
audioqueue的參數(shù)操作:
AudioQueueSetParameter
AudioQueueGetParameter
對參數(shù)的修改和獲取,具體參數(shù)parameter包括:音量的調節(jié)、聲道的調節(jié)、以及音量的漸變設置