AVFoundation
-
AVAsset
- AVAsset是一個抽象類和不可變類箭昵,定義了媒體資源混合呈現(xiàn)的方式寝杖。將媒體資源的靜態(tài)屬性模塊化成一個整體段多。AVAsset本身并不是媒體資源酸些,但是它可以作為時基媒體的容器取募。它由一個多個帶有自身元數(shù)據(jù)的媒體組成琐谤。
- AVAsset是一個抽象類,意味著它不能直接被實例化玩敏。
AVAssetTrack 類代表保存在資源 中的統(tǒng)一類型媒體斗忌,并對每個資源建立相應(yīng)的模型。
iOS Assets庫
-
異步載入
- AVAsset具有多種有用的方法和屬性旺聚,可以提供有關(guān)資源的信息织阳、比如 時長、創(chuàng)建日期和元數(shù)據(jù)等翻屈。AVAsset還包含一些用于獲取和使用曲目集合的方法陈哑。
- ACAsset使用一種高效的設(shè)計方法,即延遲載入資源的屬性伸眶,直到請求時才載入惊窖。強調(diào) 屬性的訪問總是同步發(fā)生的。如果正在請求的屬性沒有預(yù)先載入厘贼,程序就會阻塞拼坎。
- 媒體元數(shù)據(jù)
- 了解媒體的組織格式
- AVMetadataItem
-
視頻播放
- AVPlayer 是一個用來播放基于時間的視聽媒體的控制器對象鳍咱。支持播放本地纪岁、分布下載或通過HTTP Live Streaming 協(xié)議得到的流媒體卒密。并在多種播放場景中播放這些視頻資源。
- AVPlayerLayer 構(gòu)建與Core Animation之上,擴展了Core Animation的CALayer類岳掐,并通過框架在屏幕上顯示視頻內(nèi)容凭疮。這一圖層并不提供任何可視化的控件或其他附件。但是他可以用作視頻內(nèi)容的渲染面串述。創(chuàng)建AVPlayerLayer需要一個指向AVPlayer實例的指針执解。這就將播放器和土城緊密綁定在一起。
- AVPlayerItem 由一個或多個媒體曲目組成纲酗,由AVPlayerItemTrack類建立模型衰腌。AVPlayerItemTrack實例用于表示播放器條目中的類型統(tǒng)一的媒體流,
學(xué)習(xí)框架功能的第一步就是了解其中包含的各個類及每個類所扮演的角色和職責(zé)觅赊。
AVAssetReader 用于從資源讀取媒體樣本右蕊,
AVAssertWrite 用于對媒體資源進行編碼寫入到容器文件中
AVAssetReader+AVAssetReaderTrackOutput
-
講解:
- AVAssetReader 可以從原始數(shù)據(jù)里獲取解碼后的音視頻數(shù)據(jù)。結(jié)合AVAssetReaderTrackOutput 吮螺,能讀取一幀幀的CMSampleBufferRef 饶囚。CMSampleBufferRef 可以轉(zhuǎn)化成CGImageRef 帕翻。為此,我們可以創(chuàng)建一個ABSMovieDecoder 的一個類來負(fù)責(zé)視頻解碼坯约,把讀出的每一個CMSampleBufferRef 傳遞給上層熊咽。
- 1.獲取媒體文件的資源AVURLAsset
- 2.創(chuàng)建一個讀取一個媒體數(shù)據(jù)的閱讀器AVAssetReader
- 3.獲取視頻軌跡的AVAssetTrack 其實就是我們的視頻來源
- 4.為我們的閱讀器AVAssetReader進行配置莫鸭,如配置讀取的像素闹丐,視頻壓縮得到我們的輸出端口videoReaderOutput軌跡,也就是我們的數(shù)據(jù)來源被因。
- 5.為閱讀器添加輸出端口卿拴,并開啟閱讀器
--
捕捉棧
- AVCaptureSession
捕捉棧的核心類是AVCaptureSession 一個捕捉會話相當(dāng)于一個虛擬的插線板,用于連接輸入和輸出的資源梨与。捕捉會話管理從物理設(shè)備得到的數(shù)據(jù)流堕花,輸出到一個或多個目的地≈嘈可以動態(tài)配置輸入和輸出的線路缘挽。 - AVCaptureDevice 提供了一個名為videoZoomFactor的屬性,用于控制捕捉設(shè)備的縮放級等級呻粹,
- 人臉識別的思路:
- 1.創(chuàng)建一個保存在faceLayer字典中鍵值的可變副本壕曼。這個數(shù)組用來確定哪些人臉移出視圖。
- 2.遍歷每個轉(zhuǎn)換的人臉對象并捕捉其關(guān)聯(lián)的faceID這個屬性唯一標(biāo)識一個檢測到的人臉等浊。
- 3.如果給定的faceID 沒有找到對應(yīng)的層腮郊,調(diào)用makeFaceLayer方法創(chuàng)建一個新的人臉圖層
- 4.從lostFaces 數(shù)組中將剩下的人臉山從界面中刪除掉。
CMSampleBufferRef
* 是一個由Core Media 框架提供的Core Foundataion風(fēng)格的對象筹燕,用于在媒體管道中傳輸數(shù)字樣本轧飞。
--
讀取和寫入棧
-
AVAssetReader
- 用于AVAsset實例讀取媒體樣本。通常會配置一個或多個AVAssetReaderOutput實例撒踪,并通過copyNextSampleBuffer方法可以訪問音頻樣本和視頻幀过咬。
-
AVAssetWriter
- AVAssetWriter是AVAssetReader對應(yīng)的兄弟類。它用于對媒體資源進行編碼并將其寫入到容器文件中制妄。它由一個或多個AVAssetWriterInput對象配置掸绞,用于附加將要包含要寫入容器的媒體樣本的CMSampleBuffer對象。AVAssetWriterInput被配置為可以處理指定的媒體類型忍捡。比如音頻或視頻集漾,并且附加在其后
-
繪制一個音頻波形圖
- 三個步驟
- 1.讀取
- 2.縮減
- 3.渲染
媒體的組合和編輯
組合媒體
<table >
<td bgcolor=#000000>
<font color = #0099ff size=2>
- AVFoundataion 有關(guān)資源組合的功能源于AVAsset的子類AVComposition.一個組合就是將其他幾種媒體資源組合成一個自定義的臨時排列,再將這個臨時排列視為一個可以呈現(xiàn)或處理的獨立媒體資源砸脊。比如AVAsset對象 組合相當(dāng)于包含了一個或多個給定類型的媒體軌道的容器具篇。AVComposition中的軌道都是AVAssetTrack的子類AVCompositionTrack.一個組合軌道本身由一個或多個媒體片段組成,由AVCompositionTrackSegment類定義凌埂,代表這個組合中的實際媒體區(qū)域驱显。AVComposition和AVCompositionTrack都是不可變的對象,提供對資源的只讀操作。這些對象提供了一個合適的接口讓應(yīng)用程序的一部分進行播放和處理埃疫。不過當(dāng)創(chuàng)建自己的組合時就需要使用AVMutableComposition和AVMutableCompositionTrack所提供的可變子類伏恐。
- CMTime 結(jié)構(gòu)體
- CMTime實例可標(biāo)記特定的時間點或用于表示持續(xù)時間。
- CMTimeRange 由兩個CMTime值組成栓霜,第一個值定義時間范圍的起點翠桦,第二個值定義時間范圍的持續(xù)時間。
- typedef strcut
- {
- CMTime start;
- CMTime duration;
- }CMTimeRange;
</td>
</table>
--
音頻
講解:
音頻 人耳能聽到的聲音 最低的頻率一般從20Hz起一直到最高的最高頻
率20KHZ,因此音頻文件格式的最大帶寬是20KHZ胳蛮。只有采樣頻率高于聲
音信號最高頻率的兩倍時销凑,才能把數(shù)字信號表示的聲音還原成原來的聲
音,所以音頻文件的采樣率是40~50KHZ 比如最常見的CD音質(zhì)采樣率
44.1KHZ.
對聲音進行采樣仅炊、量化過程被稱為脈沖編碼調(diào)制簡稱 PCM. PCM數(shù)據(jù)是最原始的音頻數(shù)據(jù)完全無損斗幼。所以PCM數(shù)據(jù)雖然音質(zhì)優(yōu)秀但體積龐大。
iOS音頻播放概述
了解了基礎(chǔ)概念之后我們就可以列出一個經(jīng)典的音頻播放流程(以MP3為例):
1. 讀取MP3文件
2. 解析采樣率抚垄、碼率蜕窿、時長等信息,分離MP3中的音頻幀
3. 對分離出來的音頻幀解碼得到PCM數(shù)據(jù)
4. 對PCM數(shù)據(jù)進行音效處理(均衡器呆馁、混響器等桐经,非必須)
5. 把PCM數(shù)據(jù)解碼成音頻信號
6. 把音頻信號交給硬件播放
7. 重復(fù)1-6步直到播放完成
AudioSession簡介
1. 確定你的app如何使用音頻(是播放?還是錄音智哀?)
2. 為你的app選擇合適的輸入輸出設(shè)備(比如輸入用的麥克風(fēng)次询,輸出是耳機、手機功放或者airplay)
3. 協(xié)調(diào)你的app的音頻播放和系統(tǒng)以及其他app行為(例如有電話時需要打斷瓷叫,電話結(jié)束時需要恢復(fù)屯吊,按下靜音按鈕時是否歌曲也要靜音等)
<font size=1 >
第一,AudioSessionInitialize可以被多次執(zhí)行摹菠,但AudioSessionInterruptionListener只能被設(shè)置一次盒卸,這就意味著這個打斷回調(diào)方法是一個靜態(tài)方法,一旦初始化成功以后所有的打斷都會回調(diào)到這個方法次氨,即便下一次再次調(diào)用AudioSessionInitialize并且把另一個靜態(tài)方法作為參數(shù)傳入蔽介,當(dāng)打斷到來時還是會回調(diào)到第一次設(shè)置的方法上。
<font size=2 >
大概流程是這樣的:
- 一個音樂軟件A正在播放煮寡;
- 用戶打開你的軟件播放對話語音虹蓄,AudioSession active;
- 音樂軟件A音樂被打斷并收到InterruptBegin事件幸撕;
- 對話語音播放結(jié)束薇组,AudioSession deactive并且傳入NotifyOthersOnDeactivation參數(shù);
- 音樂軟件A收到InterruptEnd事件坐儿,查看Resume參數(shù)律胀,如果是ShouldResume控制音頻繼續(xù)播放宋光,如果是ShouldNotResume就維持打斷狀態(tài);