第一章:AV Foundation入門:
1.1 AV Foundation的含義
????AV Foundation是蘋果OS X系統和iOS系統中用于處理基于時間的媒體數據的高級Objective-C框架。其設計過程高度依賴多線程機制,充分利用了多核硬件的優勢并大量使用block和GCD來將復雜的計算機進程放在后臺線程運行。會自動提供硬件加速操作,確保在大部分設備上應用程序能以最佳性能運行,也充分考慮了電量效率來滿足諸如iPhone和iPad等移動設備對電量控制的高要求。此外,從一開始該框架就是針對64位處理器設計的,可以發揮64位處理器的所有優勢。-- ?好像很屌的樣子哦。。
1.2 AV Foundation的適用范圍
? ? Mac OS X和iOS為開發者提供了一些高基層和低級層的框架來實現時基媒體(timed media)的各功能。下圖展示了AV Foundation在整個體系中所處的角色。
? ? 兩個平臺都針對處理媒體相關操作提供了一系列高基層的解決方案。在iOS中,利用UIKit框架可以很容易的將基本的靜態圖片和視頻不住整合到你的應用程序中。Mac OS X和iOS兩個系統都可以通過WebView或者UIWebView中添加<audio>和<video>的HTML5標簽來播放音頻和視頻內容。此外,兩個系統都還提供了AVKit框架,用于簡化目前流行的視頻播放應用程序的創建過程。
? ? 在這些使用范圍的另一端同樣給出了一些低級層的框架,他們支持所有高基層方法所使用的功能。大部分這些框架都是低級層、基于C應用程勛且功能強大和高性能的。但是往往學習起來比較復雜,并需要對硬件級媒體處理有非常深入的理解才行。下面介紹幾個最主要的支撐框架及其提供的功能(低級層):
? ? Core Audio:Core Audio是OS X和iOS系統上處理所有音頻事件的框架。Core Audio是由多個框架整合在一起的總稱,為音頻和MIDI(Musical Instrument Digital Interface樂器數字接口)內容的錄制、播放和處理提供相應的接口。Core Audio也提供高級層的接口,比如通過Audio Queue Services框架所提供的那些接口,主要處理基本的音頻播放和錄音相關功能。同時還會提供想對低層級的接口,尤其是Audio Units接口,它們提供了針對音頻信號進行完全控制的功能,并通過Audio Units讓你能夠構建一些復雜的音頻處理模式。
? ? Core Video:Core Video是OS X和iOS系統上針對數字視頻所提供的管道模式。Core Video為其想對的Core Media提供圖片緩存和緩存池支持,提供了一個能夠對數字視頻逐幀訪問的接口。改框架通過像素格式之間的轉換并管理視頻同步事項使得復雜的工作得到了有效簡化。
? ? Core Media:Core Media是AV Foundation所用到的低級層媒體管道的一部分。它提供針對音頻樣本和視頻幀處理所需的低級層數據類型和接口。Core Media還提供了AV Foundation用到的基于CMTime數據類型的時基模型。CMTime及其相關數據類型一般在AV Foundation處理基于時間的操作時使用。
? ? Core Animation:Core Animation是OS X和iOS提供的合成及動畫相關框架。只要功能是提供蘋果平臺所具有的美觀流暢的動畫效果。它已經封裝了支持OpenGL和OpenGL ESG功能的基于Objective-C的各種類。
? ? 出于高基層和低級層中間的就是AV Foundation。在整個媒體分類圖中AV Foundation的地位舉足輕重,其提供了很多低級層框架才能實現的功能和性能,并且是以更簡單的Objective-C接口方式時間的。同時它也可以和高級層的框架無縫銜接。此外,由于AV Foundation出于UIKit和AppKit層之下,這意味著你可以在這兩個平臺下使用這個媒體框架。
1.3 解析AV Foundation
? ? 在學習AV Foundation之初,最大的挑戰就是理解該框架所提供的大量類及其功能。該框架包含的類超過100個,大量協議的集合及許多不同的功能和常量。但是,如果你將這個框架仔細地按照功能單元進行分解,就會變得比較容易理解。下面就看一下AV Foundation所提供的一些核心功能:
? ? 音頻播放和記錄:回顧一下圖1-1,會發現AV Foundation方框的右上角有一個小方格被單獨標記為“音頻專用類”。這是由AV Foundation提供的關于音頻處理的一些早期功能。AVAudioPlayer和AVAudioRecorder可以在應用程序中提供一種更簡單的整合音頻播放和記錄的功能。這些方法并不是AV Foundation用于播放和記錄視頻的唯一方式,但是學習起來最簡單且功能最強大的方法。
? ? 媒體文件檢查:AV Foundation提供檢查正在使用的媒體文件的功能。可以查看這些媒體資源來確定是否適合一些特定的任務,比如是否可以用于回訪或其是否可以被編輯和導出。還可以獲取該媒體資源相關的技術參數,比如內容持續時間、創建日期或首選播放音量等。此外,該框架還基于AVMetadataItem類提供功能強大的元數據支持。這就允許開發者讀寫關于媒體資源的描述信息,比如唱片簿和藝術家信息。
? ? 視頻播放:AV Foundation提供的其中一個最常用的功能就是視頻播放,這個功能通常是很多媒體應用程序最主要或次要的功能。AV Foundation框架可以讓你播放從本地文件或遠程流中獲取的視頻資源,并對視頻播放和內容的展示進行控制。這一部分的核心類是AVPlayer和AVPlayerItem。正是這兩個類讓你能夠對資源的播放進行控制,此外它還可以整合其他更高級的功能,如控制子標題和章節信息等,或者讓你連接訪問音頻和視頻這兩個不同的資源。
? ? 媒體捕捉:最近推出的酥油Mac和iOS設備都內置了攝像頭,作為捕捉靜態圖片和視頻的高性能外設。AV Foundation提供了一個豐富的API集來讓你可以對這些設備進行精密控制。攝像頭捕捉的核心類是AVCaptureSession,其作為所有活動的匯集點來接收攝像頭設備由各路流發過來的電影和圖片。這也是AV Foundation框架的一個可靠功能,所以其可以根據近期發布的框架版本進行答復改進。
? ? 媒體編輯:該框架允許創建可以將多個音頻和視頻資源進行組合的應用程序,允許修改和編輯獨立的媒體片段,隨時修改音頻文件的參數以及添加動畫標題和場景切換效果。Mac和iPad上的一些工具,比如Final Cut Pro X和iMovie,都是使用這個功能創建的最好示例應用。
? ? 媒體處理:有時你可能需要訪問更底層的數據并對其進行操作。幸運的是,當需要執行更高級的媒體處理任務時,可以使用AVAssetReader和AVAssetWriter類來實現這些功能。這些類提供直接訪問視頻幀和音頻樣本的功能,所以可以對媒體資源進行任何更高級的處理。
1.4 了解數字媒體
? ? 使用數字媒體已經成為了廣大用戶一種本能的習慣了。我們顯然已經處于一個數字化的時代,但是我們還是更習慣模擬信息的世界。我們看到的信號標識和所聽到的音樂都是通過模擬信號傳遞給我們的,我們的眼睛和耳朵的構造將這些信息轉換為我們大腦能夠解析出的電信號。現實生活中的信號是連續的,信號的頻率和強度是不斷變化的。但是數字世界的信號是離散的,由1和0兩個狀態標示。要將模擬信號轉換成我們能夠儲存的數字信號,要經過模擬-數字轉換過程,我們將這個過程稱為采樣(Samping)
? ? 1.4.1 數字媒體采樣:對媒體內容進行數字化主要有兩種方式。第一種稱為時間采樣,這種方式捕捉一個信號周期內的變化。第二種采樣方式是空間采樣,一般用在圖片數字化和其他可現視化媒體內容數字化的過程中。空間采樣包含對一幅圖片在一定分辨率之下捕捉其亮度和色度,進而創造由該圖片的像素點數據所構成的數字化結果。當對一段視頻進行數字化時,這兩種方式都可以使用,因為通常的視頻信號既有空間屬性又有時間屬性。
? ? 幸運的是,開發者不需要對這兩個采樣過程中所用到的具體數字化信號處理原理有很深的研究,因為設備硬件可以幫助我們完成模擬信號到數字信號的轉換。但是如果不了解這些采樣過程的基本原理及之后數字媒體內容的儲存格式的話,在你進一步深入學習AV Foundation更高級、更有趣功能的時候會感到比較吃力。所以我們還需要了解采樣過程的相關知識,下面以音頻采樣為例逐步對其進行研究。
? ? 1.4.2 音頻采樣介紹:當你聽到一個人的聲音、號角聲或者吉他彈奏聲時,你真正聽得的是聲波通過一定介質傳播過來的振動。這個振動會導致周圍的空氣分子移動,這些分子會依次同其臨近的空氣分子進行碰撞,之后再依次傳遞這個碰撞,將最初的振動能量不斷地向各個方向進行傳播。當這些波動傳到接收者的耳中時,會帶動耳膜以同樣的頻率和振幅振動。這些振動繼續傳遞到內耳的耳蝸上,此時會將這些振動轉換成電信號傳給大腦,大腦會處理這個信號并知道“我聽到了一個G調聲音”。
? ? 當我們記錄一個聲音時,比如諸如鋼琴或者吉他等樂器所發出的聲音,一般會使用麥克風設備。麥克風是將機械能量(聲波)轉換成電能量(電壓信號)的轉換設備。目前在用的麥克風種類很多,但是這里討論的麥克風類型我們成為電動式麥克風(dynamic microphone)。圖1-2展示了電動式麥克風內部的高級視圖。
? ? 在麥克風的頭部設備中所包含的,作為接受聲音的一部分,是薄薄的被稱為“膜片”的薄膜。這個膜片連接纏繞的磁極的線圈,當你對著麥克風講話時,膜片會根據其感受到的聲波進行振動,再依次帶動線圈振動,產生同輸入信號相同頻率和振幅的電流信號。使用示波器我們可以看到電信號的振蕩,如圖1-3所示。
? ? 下面再回到之前關于采樣的主題上,我們應該如何將這個連續的信號轉換成相應的離散形式呢?先灌輸一點之后會詳細介紹的音頻信號處理的核心知識,即使用音頻生成器,這里我們創建了兩個不同的音頻正弦波,如圖1-4
? ? 我們隊這個信號的兩個方面比較感興趣。第一個是振幅,它代表了電壓的強度或相應信號的強度。它代表了電壓的強度或相應信號的強度。雖然可以通過不同坐標系來呈現正弦曲線的變化,但是我們通常會選擇-0.1f到1.0f作為坐標系的最大值和最小值。對于這個信號,我們感興趣的另一個方面是頻率,信號頻率的測量單位是赫茲Hz,表示在一個周期內振動完成循環的次數。圖1-4左邊的圖片展示了1Hz情況下音頻信號的一個周期(1s內完成1次循環),右邊的圖片展示了5Hz情況下的信號情況(1s內完成5個循環)。人類可以聽到的音頻范圍是20Hz~20kHz(20000Hz),所以圖上的兩個信號都是不能被聽見的,只是其更適合展示而已。
? ? PS:雖然人類可以接收的音頻范圍是20Hz~20kHz(20000Hz),不過這個頻率范圍也只是理論上的范圍,因為幾乎沒有人可以聽見這兩個邊界頻率之外的聲音,因為一旦處于嘈雜的環境之下聽力就會減弱,同樣隨著年齡的增長聽力也會變弱。這里我們提供一些不同頻率的聲音參照,如鋼琴、AO最低音調的頻率是27.5Hz和C8,最高頻率接近4.1kHz。
? ? 音頻數字化的過程包含一個編碼方法,稱為線性脈沖編碼調制(linear pulse-code modulation),比較常見的說法是Linear PCM或LPCM。這個過程采樣或測量一個固定的音頻信號,過程的周期率被稱為采樣率。圖1-5展示了在一秒內對信號進行7次采樣及信號的數字化結果圖。
? ? 顯然低采用率的數字信號版本無法很好地表現原始數據。播放這樣的音頻信息通常會用在點擊或彈出等動作的聲音情況下。問題主要在于圖1-5所示的采樣頻率尚無法準確地表示信號的原意。我們按照圖1-6所示的情況再做一次,這次我們提高采樣頻率。
? ? 這次效果顯然得到了提升,但仍然不能準確表示原始信號。不過通過這個示例你可以推測如果不斷提高采樣的頻率,我們就可以以數字化方式準確表現原始信號的信息。鑒于硬件條件的限制,我們還不能復制出完全一樣的效果,但是我們能否找到一個采樣頻率用于生成足夠好的數字呈現效果?答案是肯定的。我們稱其為尼奎斯特頻率(Nyquist rate)。20世紀30年代,Harry Nyquist是貝爾實驗室的一名工程師,他精確的捕捉到了一個特定頻率,該頻率為需要采樣對象的最高頻率的兩倍。比如一個你需要捕捉的音頻素材的最高頻率為10kHz,你所需要的采樣率起碼為20kHz才能更好的數字化效果。使用CD錄制的音頻采樣率為44.1kHz,這就意味著能捕捉到的最大頻率為22.05kHz,剛剛高過人耳能夠識別范圍(20kHz)。44.1kHz的采樣率可能還不能捕捉到初始資源中的所有頻率范圍,這意味著采樣點可能會收到錄制環境的干擾,因為其無法捕捉到Abbey Road會話的細微差別,不過對于人耳的聽覺來說,這已經足夠好了。
? ? 除采樣率外,數字音頻采樣的另一個重要方面是我們能夠捕捉到什么精度的音頻樣本。振幅在線性坐標系中進行測量,所以會有Linear PCM這個術語。用于保存樣本值的字節數定義了在線性維度上可行的離散度,同時這個信息也被稱為音頻的位元深度。為每個樣本的整體量化分配過少的位結果信息會導致數字音頻信號產生噪音和扭曲。使用位元深度為8的方法可以提供256個離散級別的數據,對于一些音頻資源來說,這個級別的采樣率已經足夠了,但是對于大部分音頻內容來說還不夠高。CD音質的位元深度為16,可以達到65536個離散級別。專業級別的音頻錄制環境的位元深度可以達到24或更高。
? ? 對信號進行數字化時,如果能夠保留原始、未壓縮的數字呈現效果,就是該媒體資源最純粹的數字形式,但這樣做需要大量的存儲空間。比如一個44.1kHz、16位LPCM的音頻文件每分鐘可能要占用10MB的空間。要數字化一個含有12首歌的唱片,每首歌時間大概為5分鐘的話,共需要近600MB的儲存空間。即使在當今的海量儲存和高寬帶的情況下,這個文件體積仍然很大。所以我們可以看到不經過壓縮的數字音頻資源會占用大量的儲存空間,但是未壓縮的視頻文件的情況是不是這樣呢?下面了解一下組成數字視頻文件的元素來判斷能否滿足其對儲存空間的需求。
? ? 視頻文件由一系列成為“幀”的圖片組成,在視頻文件的時間軸線上每一幀都表示一個場景。要創建連續的運動畫面,我們需要在短時間間隔內提供特定數量的幀。視頻文件一秒鐘內所能展現的幀數成為視頻的幀率,并用FPS作為單元進行測量。常見的幀率是24FPS(每秒24幀)、25FPS、30FPS。
? ? 要知道未壓縮的視頻內容所需的儲存空間,我們首先需要確定每一個獨立的幀有多大。我們知道有很多通用的視頻尺寸,但是目前視頻資源最流行的寬高比為16:9,意思是每16個水平像素對應9個垂直像素。在這一寬高比之下最常見的視頻尺寸為1280*720和1920*1080.那么各自的像素情況是什么樣的呢?如果對每個像素點使用8位RGB色彩空間,這就意味著紅色占8位,綠色占8位,藍色占8位。所有的輸入手機好后,我們執行一些計算。表1-1展示了未壓縮視頻在30FPS幀率的情況下,上述兩個分辨率的儲存空間需求。
? ? 哦,天哪!我們現在遇到問題了!顯然,作為儲存和傳輸文件的格式,這簡直難以想象。也許十年后這些文件看起來能夠接受,但是目前對于大多數情況我們都無法方便的使用這么大的媒體文件。由于大部分情況下對視頻進行儲存或傳輸都是不可取的,所以我們需要找到一種方式縮小資源的尺寸。這就帶來了我們接下來討論的資源壓縮的話題。
1.5 數字媒體壓縮
? ? 為縮小數字媒體文件的大小,我們需要對其使用壓縮技術。一般來說我們所欣賞的媒體內容都進行過一定程度的壓縮。對數字媒體進行壓縮可以大幅縮小文件的尺寸,但是通常會在資源的質量上有小幅可見的衰減。
? ? 1.5.1 色彩二次抽樣?
? ? 視頻數據是使用稱之為Y'CbCr'顏色模式的典型案例,Y'CbCr'也常稱為YUV。雖然YUV術語并不是很準確,但是YUV讀起來比Y-Prime-C-B-C-R方便很多。不過大部分軟件開發者都更熟悉RGB顏色模式,即每個像素都是由紅、綠、藍三個顏色組合而成。YUV則使用色彩(顏色)通道UV替換了像素的亮度通道Y(亮度)。圖1-7展示了一幅圖片分離亮度和色彩通道后的效果。
? ? 可以看到圖片的所有細節都保存在亮度通道中,如果除去亮度,剩下的就是一幅灰度圖片,我們再看整合的色彩通道中幾乎所有的細節都丟失了。這是因為我們的眼睛對亮度的敏感度要高于顏色,聰明的工程師們認識到,我們可以大幅減少儲存在每個像素中的顏色信息,而不至于圖片的質量受損。減少這個顏色數據的過程就稱為色彩二次抽樣。
? ? 當每次看到諸如攝像頭規范和其他視頻設備硬件或軟件中提到的4:4:4、4:2:2及4:2:0時,這些值的含義就是這些設備所使用的色彩二次抽樣的參數。根據這些值按照如下格式將亮度比例表示為色度值,這個格式寫作J:a:b,具體含義如下:
? ? J:幾個關聯色塊(一般是4個)中所包含的像素數
? ? a:用來保存位于第一行中的每個J像素的色度像素個數
? ? b:用來保存位于第二行中的每個J像素的附加像素個數
? ? 為維持圖片質量,每個像素點都需要有各自的亮度值,卻不一定需要色度值。圖1-8展示了幾個常見的二次抽樣比率及其效果。
? ? 在所有的格式下,每個像素的全部亮度信息都保存下來,在4:4:4的比例下全彩色信息也被保存下來。在4:2:2的情況下,色彩信息為每兩個水平像素的平均值,即亮度和色度比率為2:1。在4:2:0的情況下,色彩信息為水平和垂直兩個方向的4個像素的平均值,結果就是亮度和色度的比率為4:1。
? ? 色彩二次抽樣一般發生在取樣時,一些專業的相機以4:4:4的參數捕捉圖像,但大部分情況下對于圖片的拍攝是使用4:2:2的方式進行的。面向消費者的攝像頭裝置,比如iPhone攝像頭,通常以4:2:0的方式進行拍攝。即使經過大量層級的二次抽象之后頁仍然可以捕捉到高質量的圖片,iPhone手機排出來的高質量視頻就是很好的例證。當以色彩作為核心或生產后期矯正顏色的時候,如果色彩方面出現了衰減,那會成為一個棘手的問題。由于我們的色彩信息是通過多個像素點平均得來的,噪聲點和其他的一些失真問題也會出現在圖片上。(這部分沒看懂。。)
? ? 1.5.2 編解碼器壓縮
? ? 大部分音頻和視頻都是使用編解碼器(codec)來壓縮的,編解碼器這個術語是由編碼器/解碼器結合簡寫得來的(encoder/decoder)。編解碼器使用高級壓縮算法對需要保存或發送的音頻或視頻數據進行壓縮和編碼,同時它還可以將壓縮文件解碼成適合播放和編輯的媒體資源文件。
? ? 編解碼器既可以進行無損壓縮也可以進行有損壓縮,無損壓縮編解碼器以一種可以完美重構解碼的方式對媒體文件進行壓縮,使其成為無論編輯還是發布都比較理想的文件,有時也會作為歸檔文件用。我們經常使用這類壓縮方式,比如我們最常用的zip和gzip即是這種方式的壓縮。顧名思義,有損編解碼器就是在壓縮過程中會有部分數據損失掉。編解碼器為這一形似的壓縮使用基于人類可感知的高級壓縮算法。比如即使人類可以理論上聽見介于20Hz~20kHz之間的聲音,但是我們可能真正敏感的頻率區間是1kHz~5kHz。我們對于頻率的感知隨著距離上述區間而逐漸減弱。在了解這一原理后,我們知道在音頻文件中可以利用過濾技術來減少或消除特定頻率。這只是眾多方法中的一個,但有損壓縮的目的是使用psycho-acoustic或psycho-visual模式作為一種方法來減少媒體內容中的冗余數據,這樣會使原文件質量的損耗到最小。
? ? 1.5.3 視頻編解碼器
? ? 對于視頻編解碼而言,AV Foundation提供有限的編解碼器集合,只提供蘋果公司認證的目前主流的幾種媒體類型的支持。具體對于視頻文件來說,主要可以歸結為H.264和Apple ProRes。
? ? H.264:
? ? 當我們需要對發送的視頻文件進行編碼時,Henry Ford說過,只要是H.264標準的文件,AV Foundation都提供視屏編解碼器支持。幸運的是,行業內也默認對該編解碼器進行了整合。這個標準廣泛用于消費者攝像頭捕捉到的資源并成為網頁流媒體視頻所使用的最主要格式。所有從itunes store下載的視頻文件也會使用這個編解碼器進行編碼。H.264規范是Motion Picture Experts Group(MPEG)所定義的MPEG-4的一部分。H.264遵循早期的MEPG-1和MEPG-2標準,但是在以更低比特率得到更高圖片質量方面有了長足進步,使其更好地用于流媒體文件和移動設備及視頻攝像頭。
? ? H.264與其他形式的MPEG壓縮一樣,通過以下兩個維度縮小了視頻文件的尺寸:1、空間:壓縮獨立視頻幀,被稱為幀內壓縮。2、時間:通過以組為單位的視頻幀壓縮冗余數據,這一過程稱為幀間壓縮。
? ? 幀內壓縮通過消除包含在每個獨立視頻幀內的色彩及結構中的冗余信息來進行壓縮,因此可在不降低圖片質量的情況下盡可能縮小尺寸。這類壓縮同JEPG壓縮原理類似。幀內壓縮也可以作為有損壓縮算法,但通常用于對原始圖片的一部分進行處理以生成極高質量的照片。通過這一過程創建的幀稱為I-frames。
? ? 在幀間壓縮中,很多幀被組合在一起作為一組圖片(簡稱GOP),對于GOP所存在的時間維度的冗余可以被消除。如果想象視頻文件中的典型場景,就會有一些特定動作元素的概念,比如行駛的汽車或街上走路的行人,場景的背景環境通常是固定的。固定的背景環境就代表一個時間維度上的冗余,這個冗余就可以通過壓縮方式進行消除。
? ? 圖1-9給出了儲存在GOP中的三個不同類型的幀:
? ??I-frames:這些幀都是一些單獨的幀或關鍵幀,包含創建完整圖片所需要的所有數據。每個GOP都正好有一個I-frames。由于它是一個獨立幀,其尺寸是最大的,但也是解壓最快的。
? ? P-frames:又稱為預測幀,是從基于最近I-frames或P-frames的可預測的圖片進行編碼得到的。P-frames可以引用最近的預測P-frames或一組I-frames。你將會經常看到這些被稱為“reference frames”的幀,臨近的P-frames和B-frames都可以對其進行引用。
? ? B-frames:又稱為雙向幀,是基于使用之前和之后的幀信息進行編碼后得到的幀。幾乎不需要儲存空間,但其解壓過程會耗費較長時間,因為它依賴于周圍其他的幀。
H.264還支持編碼視圖,用于確定在整個編碼過程中所使用的算法。共定義了3個高級標準:
? ? Baseline:這個標準通常用于對移動設備的媒體內容進行處理,提供了最低效的壓縮,因此經過這個標準壓縮后的文件仍較大,但是同時這種方法也是最少計算強度的方法,因為它不支持B-frames。如果開發者的編譯目標是年代比較久遠的iOS設備,比如iPhone 3GS,可能需要用到Baseline標準。
? ? Main:這個標準的計算強度要比Baseline的高,因為它使用的算法更多,但可以達到比較高的壓縮率。
? ? High:高標準的方法會得到最高質量的壓縮效果,但它也是3種方法中計算復雜度最高的,因為所有能用到的編碼技術和算法幾乎都用到了。
? ? Apple ProRes:
? ? AV Foundation支持Apple ProRes編解碼器的兩種不同風格。Apple ProRes被認為是一個中間件或中間層編解碼器,因為它的目的是為專業編輯和生產工作流服務。Apple ProRes編解碼器是獨立于幀的,意味著只有I-frames可以被使用,這就使其更適合用在內容編輯上。此外,Apple ProRes還使用可變比特率編碼的方式來對復雜場景中的每一幀進行編碼。
? ? ProRes是有損編解碼器,但是它具有最高的編解碼質量。Apple ProRes 422使用4:2:2的色彩二次抽樣的10位的采樣深度。Apple ProRes 4444使用4:4:4色彩二次抽樣,具有最終4個用于表示支持無損alpha通道和高達12位的采樣深度。
? ? ProRes編解碼器只在OS X上可用,如果開發者只針對iOS進行開發工作,只能使用H.264。然而蘋果公司提供了一種方法,當我們捕捉圖像的目的是對其進行編輯時,可以將目標變換成通用的H.264編碼格式,成為iFrame。對于編輯環境而言這是一個I-frames-only變量生成H.264視頻更適合的一種方法。這種格式在AV Foundation中是受支持的,并且它還被眾多攝像頭生產企業所支持,比如Canon、Panasonic和Nikon。 PS:對H.264和Apple ProRes來說,AV Foundation還支持很多攝像頭的編解碼器,如MPEG-1、MPEG-2、MPEG-4、H.263和DV,允許用戶以多種不同的視頻捕捉設備導入內容資源。
? ? 1.5.4 音頻編解碼器
? ? 只要是Core Audio框架支持的音頻編解碼,AV Foundation都可以支持,這意味著AV Foundation能夠支持大量不同格式的資源,然而在不用線性PCM音頻的情況下,更多的只能使用AAC。
? ? AAC:高級音頻編碼(AAC)是H.264標準相對應的音頻處理方式,目前已成為音頻流和下載的音頻資源中最主流的編碼方式。這種格式比MP3格式有這顯著的提升,可以在低比特率的前提下提供最高質量的音頻,是在Web上發布和傳播的音頻格式中最為理想的。此外,AAC沒有來自證書和許可方面的限制,這一限制曾經在MP3格式上個飽受詬病。
? ? PS:AV Foundation和Core Audio提供對MP3數據編碼的支持,但是不支持對其進行編碼。
1.6 容器格式
? ? 如果你和大家一樣,喜歡在自己的電腦上查找不同類型的媒體文件,你可能會注意到以各種擴展名結尾的文件,比如.mov、.m4v、.mpg和.m4a等等。雖然我們通常將這些類型都認為是文件格式,但其正確定義應該是這些類型都是文件的容器格式(container format)。
? ? 容器可是被認為是元文件格式。從更高的角度看,可將容器格式視為包含一種或更多種媒體類型(以及描述其內容的元數據)的目錄。比如QuickTime文件可以包含多種不同的媒體類型,包括視頻、音頻、字母和章節信息等,并且包含用于描述每個媒體片段細節的元數據。
? ? 每個格式都有一個規范用于確定文件的結構。所謂的結構并不僅是其包含的媒體資源技術領域的問題,比如媒體的周期、編碼和時間信息,一般來說還定義了描述性原數據,比如電影標題或一首歌曲的作者信息等。這些元數據可以通過工具進行呈現,比如常見的iTunes或iOS的Music應用程序,而且AV Foundation還提供了相關的類用于在開發者的應用程序內讀取或寫入該類型的數據。
? ? 當開發者使用AV Foundation拽寫代碼時,將遇到兩類主要的容器格式,它們分別為:QuickTime和MPEG-4
? ? QuickTime:是蘋果公司再更宏觀QuickTime架構中定義的最常見格式。其具有非常高的可靠性并且是一種有著非常清晰定義的格式,被專業領域人士和普通消費者廣泛使用。
? ? MPEG-4:MPEG-4 Part14規范定義MPEG-4(MP4)容器格式。這是從QuickTime規范中直接派生出來的一種行業標準格式,所以這兩個規范在結構和功能方面非常類似。MP4容器格式的官方文件擴展名是.mp4,但有很多不同的變化擴展名也在使用,尤其是在蘋果系統生態環境中。這些變化的文件擴展名仍展示用相同的基本MP4容器格式,他們通常用來區分一些特定的媒體類型,如m4a格式的音頻文件,還可以使用這些擴展名來標示一些基本的MP4容器,如m4a格式的視頻文件。
1.7 初始 AV Foundation
? ? 現在你應該對AV Foundation有了比較深入的了解,并且對數字媒體的細節也有了一定認識,下面增添一些有趣的東西。
? ? Mac OS X一直都有一個NSSpeechSynthesizer類,使用這個類可以很方便地在Cocoa應用中添加“文本轉語音”功能。開發者可使用AV Foundation中的AVSpeechSynthesizer類向iOS應用中添加類似功能。這個類用于播放一個或多個語音內容,這些語音內容都是名為AVSpeechUtterance的類的實例。如果你希望播放語句“Hello World”,具體代碼如下:
接下來是書中第一個小項目的核心代碼:
1.8 小結
? ? 常規操作,略了。。。
1.9 挑戰
? ? 打開AV Foundation的API文檔,利用一些時間瀏覽一下全部文檔的內容,對其中所涉及的類的邏輯關系進行了解,同事對整個框架中所使用的命名約定有所了解。這樣做可以讓你開始了解框架所提供的功能范圍,并且使你更好地熟悉框架使用過程中的編碼模式和約定。