1. 程式人生 > >《AV Foundation 開發祕籍》讀書筆記(一)

《AV Foundation 開發祕籍》讀書筆記(一)

第一章 AV Foundation 簡介

1991 年蘋果推出了 Quick Time 首次將數字音訊和數字視訊展現在使用者面前,Quick Time 架構在之後 20 年間給數字多媒體這一領域帶來了變革,對教育、遊戲、娛樂產業的發展影響巨大。但是隨著時間的推移,缺點也越來越多,於是蘋果推出了一個新的框架,它就是 AV Foundation

1. AV Foundation 層級

AV Foundation 是用於處理基於時間的視聽資料的高階框架。下圖展示了 AV Foundation 在整個體系中所處的角色。

pic01

Core Audio

Core Audio 是由多個框架整合在一起的總稱,為音訊和 MIDI 內容的錄製、播放和處理提供相應介面。Core Audio 也提供高層級的介面,比如通過 Audio Queue Services 框架,處理基本的音訊播放和錄音功能。同時也提供相對低層級的介面,尤其是 Audio Units 介面,提供了針對音訊訊號進行完全控制的功能,並通過 Audio Units 構建一些複雜的音訊處理模式。如果想詳細瞭解這一框架,建議閱讀由 Chirs Adamson 和 Kevin Avila 撰寫的 Learning Core Audio 一書。

Core Video

Core Video 是針對數字視訊所提供的管道模式,為其相對的 Core Media 提供圖片快取和快取池支援,提供了一個能夠對數字視訊逐幀訪問的介面。該框架通過畫素格式之間的轉換並管理視訊同步事項,使得複雜的工作得到了有效簡化。

Core Media

Core Media 是 AV Foundation 所用到的低層級媒體管道的一部分。它提供針對音訊樣本和視訊幀處理所需的低層級資料型別和介面。Core Media 還提供了基於 CMTime 資料型別的時基模型。

Core Animation

Core Animation 是合成及動畫相關框架,主要功能就是提供美觀、流暢的動畫效果。對於視訊內容的播放和視訊捕獲,AV Foundation 提供了硬體加速機制來對整個流程進行優化。AV Foundation 還可以利用 Core Animation 讓開發者能夠在視訊編輯和播放過程中新增動畫標題和圖片效果。

處於高層級框架和低層級框架之間就是 AV Foundation,其提供了很多低層級框架才能實現的功能和效能,並且是以更簡單的 OC 介面方式實現的。同時它也可以和高層級的框架無縫連線,比如 Media Player 和 Assets Library,使用這兩個框架所提供的服務,也可以直接和 Core Media 和 Core Audio 進行互動。

2. AV Foundation 框架

AV Foundation 框架包含 100 多個類,如果將其按照功能單元進行分解,就會變得比較容易理解:

音訊播放和記錄

如上圖所示 AV Foundation 方框右上角有一個小方格被單獨標記為音訊專用類,這是由 AV Foundation 提供的關於音訊處理的一些早期功能。AVAudioPlayer 和 AVAudioRecorder 可以提供一種更簡單的整合音訊播放和記錄的功能,但是並不是 AV Foundation 用於播放和記錄音訊的唯一方式,卻是最容易學習、功能最強大的方法。

媒體檔案檢查

AV Foundation 提供檢查正在使用的媒體檔案的功能,比如是否可以用於回放,或者是否可以被編輯和匯出,還可以獲取內容持續時間,建立日期,首選播放音量。此外,該框架還基於 AVMetadataItem 類提供強大的元資料支援,這就允許開發者讀寫關於媒體資源的描述資訊,比如唱片簿和藝術家資訊。

視訊播放

這是 AV Foundation 提供的最常用的功能,這一部分的核心類是 AVPlayer 和 AVPlayerItem,這兩個類讓你能夠對資源的播放進行控制。

媒體捕捉

AV Foundation 提供了豐富的 API 集可以對攝像頭等裝置進行精密控制。攝像頭捕捉的核心類是 AVCaptureSession,其作為所有活動的匯集點來接收攝像頭裝置由各路流發過來的視訊和圖片。

媒體編輯

AV Foundation 可以將多個音訊和視訊資源進行組合,允許修改和編輯獨立的媒體片段、隨時修改音訊檔案的引數以及新增動畫標題和場景切換效果。

媒體處理

使用 AVAssetReader 和 AVAssetWritere 類來執行更高階的媒體處理任務,這些類可以直接訪問視訊幀和音訊樣本。

3. 數字媒體簡介

雖然我們處在一個數字化的時代,但是我們還是更習慣模擬資訊的世界。我們看到的和聽到的都是通過模擬訊號傳遞給我們,訊號的頻率和強度是在不斷變化的。但是數字世界的訊號是離散的,由 1 和 0 組成。將模擬訊號轉換成我們能夠儲存並傳輸的數字訊號,要進過模數轉換,我們將這個過程稱為取樣(Sampling)。

3.1 數字媒體取樣

對媒體內容數字化主要有兩種方式。第一種稱為時間取樣,這種方法捕捉一個訊號週期內的變化。第二種稱為空間取樣,一般用在圖片數字化和其他視覺化媒體內容數字化的過程中。空間取樣包含對一幅圖片在一定解析度之下捕捉其亮度和色度,進而建立由該圖片的畫素點資料所構成的數字化結果。

3.2 數字媒體壓縮 - 色彩二次抽樣

與我們熟知的 RGB 類似,YUV 也是一種顏色編碼方法,主要用於電視系統和模擬視訊領域。Y 表示亮度,也就是灰度值,UV 表示色度,用於指定畫素的顏色。圖片所有細節都儲存在 Y 通道中,如果除去 Y 資訊,剩下的就是一幅灰度圖片;如果除去 UV 資訊,則變成黑白影像。因為我們的眼睛對亮度的敏感度要高於顏色,所以我們可以大幅減少儲存在每個畫素中的顏色資訊,不至於圖片的質量嚴重受損,這個減少顏色資料的過程就稱為色彩二次抽樣。

YUV 主流的取樣方式有三種:4:4:4、4:2:2、4:2:0,這些值就是裝置所使用的色彩二次抽樣的引數。一些專業相機以 4:4:4 的引數捕捉影象,但大部分情況下使用 4:2:2 的方式進行拍攝,iPhone 攝像頭通常以 4:2:0 方式進行拍攝。

4:4:4

  • 每一個 Y 對應一組 UV 分量
  • 表示 UV 沒有減少採樣,即 Y、U、V 各佔一個位元組,加上 alpha 通道一個位元組,共 4 位元組,這個格式其實就是 24bpp 的 RGB 格式了。

4:2:2

  • 每兩個 Y 共用一組 UV 分量
  • 表示 U、V 分量取樣減半,比如第一個畫素取樣 YU,第二個畫素取樣 YV,以此類推。

4:2:0

  • 每四個 Y 共用一組 UV 分量
  • 這裡的 0 意思是 U、V 分量隔行取樣一次,比如第一行取樣 4:2:0,第二行取樣 4:0:2,以此類推。

pic02

3.3 數字媒體壓縮 - 編解碼器壓縮

編解碼器壓縮分為無失真壓縮和有失真壓縮。有失真壓縮舉例:人類可以聽到的音訊範圍是 20 Hz - 20 kHz,但是我們真正敏感的頻率區間是 1 kHz - 5 kHz,使用過濾技術來減少或消除特定頻率,從而減少媒體內容中的冗餘資料。

3.4 數字媒體壓縮 - 視訊編解碼器

AV Foundation 提供有限的編解碼器集合,主要歸結為 H.264 和 Apple ProRes

3.4.1 H.264

H.264 / MPEG-4 第十部分,或稱 AVC(Advanced Video Coding,高階視訊編碼),是由 ITU-T(國際電信聯盟 - 電信標準化部門) 群組之一的 VCEG(視訊編碼專家組) 與 MPEG(動態影象專家組,也就是 ISO / IEC(國際標準化組織 / 國際電工委員會)聯合工作組)聯合組成的 JVT(聯合視訊組)開發。因 ITU-T H.264 標準和 ISO / IEC MPEG-4 AVC 標準有相同的技術內容,所以被共同管理。

H.264 和其他形式的 MPEG 壓縮一樣,通過空間(幀內壓縮)和時間(幀間壓縮)兩個維度縮小視訊檔案的尺寸。

幀內壓縮:

通過消除視訊幀內的色彩和結構中的冗餘資訊來進行壓縮,在不降低圖片質量的情況下儘可能縮小尺寸,同 JEPG 壓縮原理類似,通過這一過程建立的幀稱為 I-frames

幀間壓縮:

很多幀組合在一起作為一組圖片(簡稱 GOP),對於 GOP 所存在的時間維度的冗餘可以被消除。比如行駛的汽車,背景環境通常是固定的,就代表一個時間維度上的冗餘,可以通過壓縮方式消除。通過這一過程可建立的幀稱為 B-frames 和 P-frames

I 幀,關鍵幀。包含建立完整圖片需要的所有資料,每組都會有一個 I 幀。由於它是一個獨立幀,其尺寸最大,但是解壓最快;

P 幀,差別幀。表示這一幀和之前的 I 幀(或 P 幀)的差別,解碼時需要用之前快取的畫面疊加上本幀定義的差別,生成最終畫面;

B 幀,雙向幀。記錄本幀和前後幀的差別。不僅要取得之前的快取畫面,還有解碼之後的畫面,通過前後畫面與本幀資料的疊加取得最終的畫面。幾乎不需要儲存空間,但是解壓比較耗時,因為它依賴於周圍其他的幀。

H.264 一共有三種壓縮標準,從低到高分別為:

Baseline

低效,只支援 I / P 幀,一般用於低階或需要額外容錯的應用,比如視訊通話、手機視訊等

Main

主要,提供 I / P / B 幀,一般用於主流消費類電子產品規格如 mp4、PSP、iPod 等

High

高階,在 Main 的基礎上增加了 8x8 內部預測、自定義量化、無損視訊編碼和更多的YUV 格式(如 4:4:4),用於藍光影片,高清電視

3.4.2 Apple ProRes

Apple ProRes 被認為是一箇中間件或中間層編解碼器,其獨立於幀的,意味著只有 I 幀可以被使用,其更適用於內容編輯上。但是 ProRes 編解碼器只在 MAC OS 上可用,iOS 只能使用 H.264

ProRes 是有損編解碼器,但是它具有最高的編解碼質量。Apple ProRes 422 使用 4:2:2 色彩二次抽樣和 10 位的取樣深度。Apple ProRes 4444 使用 4:4:4:4 色彩二次抽樣,4 個表示支援無損 alpha 通道和高達 12 位的取樣深度。

3.5 數字媒體壓縮 - 音訊編解碼器

AAC(高階音訊編碼)是 H.264 標準相應的音訊處理方式,目前是最主流的編碼方式。這種格式比 MP3 格式有著顯著的提升,可以在低位元率的前提下提供更高質量的音訊,是 Web 上釋出和傳播中最理想的音訊格式。而且相對 MP3 來說,AAC 沒有來自證書和許可方面的限制。

注意:AV Foundation 和 Core Audio 支援 MP3 資料解碼,但是不支援編碼。

4. 文字轉語音播放

#import <AVFoundation/AVFoundation.h>

// 語音表達
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:@"哎呦我擦。你嚇死我了。"];
utterance.voice              = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CH"];  // 語言
utterance.rate               = 0.4f;  // 語速(0 ~ 1)
utterance.pitchMultiplier    = 1.0f;  // 音調(0.5 ~ 2.0)
utterance.postUtteranceDelay = 0.1f;  // 播放下一句有短暫的暫停

// 語音合成器
AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];
[synthesizer speakUtterance:utterance];

相關推薦

AV Foundation 開發祕籍讀書筆記

第一章 AV Foundation 簡介 1991 年蘋果推出了 Quick Time 首次將數字音訊和數字視訊展現在使用者面前,Quick Time 架構在之後 20 年間給數字多媒體這一領域帶來了變革,對教育、遊戲、娛樂產業的發展影響巨大。但是隨著時間的推

《Android 開發藝術探索》讀書筆記——Activity 的生命週期和啟動模式

Activity 作為 Android 四大元件之首,它作為和使用者互動的介面,在開發中使用得可謂極其頻繁,所以弄清楚 Activity 的生命週期和啟動方式是非常重要的,要牢記。 1 Activity 的生命週期全面分析 1.1 典型情況下的生命週期分析 onCrea

Android開發藝術探索讀書筆記

           首先向各位嚴重推薦主席這本書《Android開發藝術探索》。 再感謝主席邀請寫這篇讀書筆記 + 書評。書已經完整的翻完一遍了,但是還沒有細緻的品讀並run程式碼,最近有時間正好系統的把整本書從內容到程式碼都梳理一遍,一方面方便自己總結,一方面也為主席宣

《代碼閱讀》讀書筆記

需求 的人 一行 編碼 重要 流動 使用 分析 缺少 《代碼閱讀》讀書筆記(一) 《代碼閱讀》(《Code Reading The Open Source Perspective》)Diomidis Spinellis 著 ---------------------

SICP讀書筆記

自由 運用 實參 隱藏 更多 定義 並不是 謂詞 精確 第一章 構造過程抽象 計算過程是存在於計算機裏的一類抽象事物,它在演化過程中會去操作一些被稱為數據的抽象事物。我們通過創建被稱為程序的規則模式來指導這類過程的進行。程序由程序設計語言編排而成。 我們將要使用Lisp

前端開發入門學習筆記

type red 學習 lin attach black 復合 等於 round HTML:超文本標記語言。 html:是一個基礎結構。 CSS:就是跟網頁做裝修的,修飾HTML的基礎內容:樣式。 JavaScript:一個網頁的行為,動作,動態的東西。 html標準文件格

崔華基於oracle的SQL優化讀書筆記如何得到真實的執行計劃

hash mes getting binary oracl only 中文 fun roc ---恢復內容開始--- 得到目標SQL的執行計劃,大致有以下四種方式: 1.explain plan 命令 2.DBMS_XPLAN包 3.SQLPLUS中的autotrace開關

《可愛的Python》讀書筆記

可愛的Python 閏年 素數 質數 Just use it! don't learn!——只用,不學!無意間了解到《可愛的Python》就被它的名字所吸引。查了書評得知這本書是有爭議的,有人覺得書中很多都是點到為止不適合新手入門,處處給讀者挖坑,結構混亂更不能作為參考書。有人認為此書

《Python網絡數據采集》讀書筆記

urllib BeautifulSoup 思考“網絡爬蟲”時通常的想法:? 通過網站域名獲取 HTML 數據? 根據目標信息解析數據? 存儲目標信息? 如果有必要,移動到另一個網頁重復這個過程當網絡瀏覽器遇到一個標簽時,比如<img src="cuteKitten.jpg"&

《用戶網絡行為畫像》讀書筆記

感覺 數據結構 定性 角度 筆記 穩定性 包括 習慣 收藏 推薦就是發掘用戶集合和對象集合的語義關系,為用戶提供語義最相關的 TOP-N 對象集合。 語義關系就是能讀懂用戶偏好興趣的核心。 推薦系統是面向具體業務的交叉研究,無業務講推薦系統,感覺言之無物;從技術來講,不同的

《編碼-隱匿在計算機背後的語言》 —— 讀書筆記:編碼

分享圖片 信號 組合 大小寫 不變 缺點 改變 有著 書寫 1. 至親密友 1) 什麽是編碼?編碼是一種用來在機器與人之間傳遞信息的方式,編碼就是交流。 2)莫爾斯電碼,只有點和劃(國際求救信號:SOS ...---...),缺點是不區分大小寫。

《軟件測試方法和技術》-讀書筆記

圖片 軟件工程 AI 開發 支持 ont 3年 發的 一次 軟件測試正反兩方面的爭辯 軟件測試領域先驅 Bill Hetzel 博士 1993年在美國的北卡羅來納大學組織了歷史上第一次正式的關於軟件測試的會議。從此以後,軟件測試開始頻繁出現在軟件工程的研究和實踐中,也可以認

《黑客與畫家》讀書筆記

能說 互聯 可能 研究 歷史 設計 職位 天下無敵 聯網 《黑客與畫家》讀書筆記(一) 黑客與畫家 黑客與畫家的共同之處,在於他們都是創作者,都試圖創作出優秀的作品。 他們本質上都不是在做研究,雖然過程中可能發現一些新技術。黑客的出發點是原創,最終得到一個優美的結果;科學家

深度探索C++對象模型讀書筆記

復雜 理解 image play 基礎上 isp 靜態 布局 bject 《深度探索C++對象模型》這本書也算是學習C++面向對象編程的必備書了,打算花上幾天先簡單的看一遍,這種書看上好幾遍也不一定能理解太多,慢慢積累一點一滴吃透就好。下面把我看書過程中覺得比較有意義的摘錄

《深入理解計算機系統》——讀書筆記

img 可執行 即將 簡單的 world std 加載 完整 .exe   這本書從一個簡單的C語言的HelloWorld程序講起...   這是這個小程序的生命周期的一個部分:   HellOWorld程序,從被創建(文本格式),到被執行(在屏幕上打印出來)。   其

遊戲人工智能 讀書筆記前言與介紹

style 簡單的 center 不同 可能性 傳統 lock 常見 symbol WeTest 導讀 自人工智能誕生之始,就和遊戲緊密的相結合在一起。因為人們通常認為,人類玩遊戲的過程是蘊含著人類的智能的。因此,當人們創造出一個能夠完成人類的某種遊戲的程序,我們認為這個程

C陷阱與缺陷讀書筆記

之間 之前 符號 雙引號 陷阱 數組 調用 筆記 如果 第一章 1.2 按位運算符:& 邏輯運算符:&& 1.3 單字符符號:只有一個字符長 多字符符號:含多個字符

《JavaScript高級程序設計》讀書筆記JavaScript簡介

範圍 應用程序編程接口 分辨率 移動 views 標記語言 語句 AMM mode 起於客戶端數據驗證特性----閉包----匿名函數----元編程等----等想要全面理解和掌握JavaScript----本質----歷史----局限性 ECMAScript 腳本語言標準

《C#從現象到本質》讀書筆記

托管代碼 操作 擁有 底層 不同 使用 子集 存在 基於 最近根據博客園大神的推薦,買了本《C#從現象到本質》。做一點讀書筆記。 由於不懂IL和ldsdm,winddg,太深奧,理解不了,就牛嚼草一樣,先總結第一遍讀書,自己總結的知識點了。不知道這樣會不會侵權,如果侵權了,

微觀經濟學讀書筆記

寫在前面:世界風起雲湧,不懂點經濟學感覺都看不懂啊。  Ref:微觀經濟學,薩繆爾森。 Chapter 1:內容要點提要 1. 投機:包括對有價值物品或商品的買和賣。是從市場價格的波動中獲取利益的一種活動。投機的初衷是低價買入高價賣出。投機的方式包括時間排程和空間排程。投機的最終結果