前沿
隨著移動技術的成熟和即將到來的5G時代 ,越來越多的公司開發移動視訊軟體來佔領市場,隨著抖音的登場 視訊APP現已是火海一片,BAT紛紛入場。
為了能在紅海中分一杯羹 我司決定開發一款賽馬的視訊觀看專案,在專案的開發中 對蘋果的AVFoundation框架進行了瞭解和學習 在學習過程中越來越佩服AVFoundation
框架的厲害之處。我會分幾篇文章來分析AVFoundation
中常用的API和類
AVFoundation入門
在學習AVFoundation
之初,最大的挑戰就是理解該框架所提供的大量類及其功能。該框架包含的類超過100個、大量協議的集合及許多不同的功能和常量。在第一次遇到這些問題時看似掌握這個框架有一定的難度, 但是如果你將這個框架仔細地按功能單元進行分解,就會變得比較容易理解。下面就看一下 AVFoundation所提供的一些核心功能。
-
音訊播放和記錄
AVAudioPlayer
和AVAudioRecorder
可以在應用程式中提供一種更簡單的整合音訊播放和記錄的功能。這些方法並不是AVFoundation
用於播放和記錄音訊的唯一方式,卻是學習起來最簡單並且功能最強大的方法
-
媒體檔案檢查
AVFoundation
提供檢查正在使用的媒體檔案的功能。可以檢視這些媒體資源來確定是否適合一些特定的任務,比如是否可以用於回放或其是否可以被編輯和匯出。還可以獲取該媒體資源相關的技術引數,比如內容持續時間 建立日期或首選播放音量等。此外,該框架還基於AVMetadataItem
類提供功能強大的後設資料支援。這就允許開發者讀寫關於媒體資源的描述資訊。
-
視訊播放
AVFoundation
框架可以讓你播放從本地檔案或遠端流中獲取的視訊資源,並對視訊播放和內容的展示進行控制。這一部分的核心類是AVPlayer
和AVPlayerItem
,正是這兩個類讓你能夠對資源的播放進行控制,此外它還可以整合其他更高階的功能,如控制子標題和章節資訊等。或者讓你連結訪問音訊和視訊這兩個不同的資源。
-
媒體捕捉
AVFoundation
提供了一個豐富的API集來讓你可以對這些裝置進行精密控制。攝像頭捕捉的核心類是AVCaptureSession
,其作為所有活動的匯集點來接收攝像頭裝置由各路流發過來的電影和圖片。這也是AVFoundation
框架的一個可靠功能。
-
媒體編輯
AVFoundation
框架語允許建立可以將多個音訊和視訊資源進行組合的應用程式,允許修改和編輯獨立的媒體片段,隨時修改音訊檔案的引數以及新增動畫標題和場景切換效果。
AVFoundation
有關資源組合的功能源於AVAsset
的子類AVComposition
。AVComposition
中的軌道都是AVAssetTrack
的子類AVCompositionTrack
。一個組合軌跡本身由一個或多個媒體片斷組成,由AVCompositionTrackSegment
類定義,代表這個組合中的實際媒體區域,描述如下圖所示:
AVComposition
和AVCompositionTrack
都是不可變物件,提供對資源的只讀操作。這些物件提供了一個合適的介面讓應用程式的一部分可以進行播放或處理。但當需要建立自己的組合時,就需要使用AVMutableComposition
和AVMutableCompositionTrack
所提供的可變子類。要建立自定義組合,需指定在將要新增到組合的源媒體的時間範圍,還要指定要新增片段的每個軌道的位置。
-
媒體處理
雖然通過AVFoundation
框架可以在不通過對媒體資源位元組一級進行操作的前提下實現大量功能,但有時你可能還是需要訪問更低層的資料並對其進行操作。幸運的是,當需要執行更高階的媒體處理任務時,可以使用AVAssetReader
和AVAssetWriter
類來實現這些功能。這些類提供直接訪問視訊幀和音訊樣本的功能,所以可以對媒體資源進行任何更高階的處理。
視訊的基本知識點
-
流媒體開發: 網路層(socket或st)負責傳輸,協議層(rtmp或hls)負責網路打包,封裝層(flv、ts)負責編解碼資料的封裝,編碼層(h.264和aac)負責影象,音訊壓縮。
-
幀:每幀代表一幅靜止的影象
-
GOP: (
Group of Pictures
)畫面組,一個GOP就是一組連續的畫面,每個畫面都是一幀,一個GOP就是很多幀的集合. (直播的資料,其實是一組圖片,包括I幀、P幀、B幀,當使用者第一次觀看的時候,會尋找I幀,而播放器會到伺服器尋找到最近的I幀反饋給使用者。因此,GOP Cache增加了端到端延遲,因為它必須要拿到最近的I幀). GOP Cache的長度越長,畫面質量越好 -
位元速率: 圖片進行壓縮後每秒顯示的資料量。
-
幀率: 每秒顯示的圖片數。影響畫面流暢度,與畫面流暢度成正比:幀率越大,畫面越流暢;幀率越小,畫面越有跳動感。(由於人類眼睛的特殊生理結構,如果所看畫面之幀率高於16的時候,就會認為是連貫的,此現象稱之為視覺暫留。並且當幀速達到一定數值後,再增長的話,人眼也不容易察覺到有明顯的流暢度提升了。)
-
解析度:(矩形)圖片的長度和寬度,即圖片的尺寸
-
壓縮前的每秒資料量:幀率X解析度(單位應該是若干個位元組)
-
壓縮比:壓縮前的每秒資料量/位元速率 (對於同一個視訊源並採用同一種視訊編碼演算法,則:壓縮比越高,畫面質量越差。)
-
視訊檔案格式:檔案的字尾,比如
.wmv
,.mov
,.mp4
,.mp3
,.avi
,(主要用處:根據檔案格式,系統會自動判斷用什麼軟體開啟, 注意: 隨意修改檔案格式,對檔案的本身不會造成太大的影響,比如把avi
改成mp4
,檔案還是avi.
) -
視訊封裝格式:一種儲存視訊資訊的容器,流式封裝可以有
TS
、FLV
等,索引式的封裝有MP4
,MOV
,AVI
等,(主要作用:一個視訊檔案往往會包含影象和音訊,還有一些配置資訊(如影象和音訊的關聯,如何解碼它們等):這些內容需要按照一定的規則組織、封裝起來.
注意:會發現封裝格式跟檔案格式一樣,因為一般視訊檔案格式的字尾名即採用相應的視訊封裝格式的名稱,所以視訊檔案格式就是視訊封裝格式。) -
視訊封裝格式和視訊壓縮編碼標準:就好像專案工程和程式語言,封裝格式就是一個專案的工程,視訊編碼方式就是程式語言,一個專案工程可以用不同語言開發。
視訊編碼框架
FFmpeg
:是一個跨平臺的開源視訊框架,能實現如視訊編碼,解碼,轉碼,串流,播放等豐富的功能。其支援的視訊格式以及播放協議非常豐富,幾乎包含了所有音視訊編解碼、封裝格式以及播放協議。- -Libswresample:可以對音訊進行重取樣,rematrixing 以及轉換取樣格式等操 作。
- -Libavcodec:提供了一個通用的編解碼框架,包含了許多視訊,音訊,字幕流 等編碼/解碼器。
- -Libavformat:用於對視訊進行封裝/解封裝。
- -Libavutil:包含一些共用的函式,如隨機數生成,資料結構,數學運算等。
- -Libpostproc:用於進行視訊的一些後期處理。
- -Libswscale:用於視訊影象縮放,顏色空間轉換等。
- -Libavfilter:提供濾鏡功能。
X264
:把視訊原資料YUV編碼壓縮成H.264格式VideoToolbox
:蘋果自帶的視訊硬解碼和硬編碼API,但是在iOS8之後才開放。 *AudioToolbox
:蘋果自帶的音訊硬解碼和硬編碼API
視訊編碼技術
-
視訊壓縮編碼標準:對視訊進行壓縮(視訊編碼)或者解壓縮(視訊解碼)的編碼技術,比如
MPEG
,H.264
,這些視訊編碼技術是壓縮編碼視訊的- 主要作用:是將視訊畫素資料壓縮成為視訊碼流,從而降低視訊的資料量。如果視訊不經過壓縮編碼的話,體積通常是非常大的,一部電影可能就要上百G的空間。
- 注意:最影響視訊質量的是其視訊編碼資料和音訊編碼資料,跟封裝格式沒有多大關係
-
MPEG
:一種視訊壓縮方式,它採用了幀間壓縮,僅儲存連續幀之間有差別的地方 ,從而達到較大的壓縮比 -
H.264/AVC
:一種視訊壓縮方式,採用事先預測和與MPEG
中的P-B幀一樣的幀預測方法壓縮,它可以根據需要產生適合網路情況傳輸的視訊流,還有更高的壓縮比,有更好的圖象質量- 注意1:如果是從單個畫面清晰度比較,
MPEG4
有優勢;從動作連貫性上的清晰度,H.264
有優勢 - 注意2:由於264的演算法更加複雜,程式實現煩瑣,執行它需要更多的處理器和記憶體資源。因此,執行
264
對系統要求是比較高的。 - 注意3:由於264的實現更加靈活,它把一些實現留給了廠商自己去實現,雖然這樣給實現帶來了很多好處,但是不同產品之間互通成了很大的問題,造成了通過A公司的編碼器編出的資料,必須通過A公司的解碼器去解這樣尷尬的事情
- 注意1:如果是從單個畫面清晰度比較,
-
H.265/HEVC
:一種視訊壓縮方式,基於H.264
,保留原來的某些技術,同時對一些相關的技術加以改進,以改善碼流、編碼質量、延時和演算法複雜度之間的關係,達到最優化設定。H.265
是一種更為高效的編碼標準,能夠在同等畫質效果下將內容的體積壓縮得更小,傳輸時更快更省頻寬
-
I-frames幀
:(關鍵幀)保留一副完整的畫面,解碼時只需要本幀資料就可以完成(這些幀都是一些單獨的幀或關鍵幀,包含建立完整圖片 需要的所有資料。每個GOP都正好有一個I-frames。由於它是獨立幀,其尺寸最大,但也是解壓最快的) *P-frames幀
:(差別幀,預測幀)保留這一幀跟之前幀的差別,解碼時需要用之前快取的畫面疊加上本幀定義的差別,生成最終畫面。(P幀沒有完整畫面資料,只有與前一幀的畫面差別的資料) -
B-frames幀
:(雙向差別幀)保留的是本幀與前後幀的差別,解碼B幀,不僅要取得之前的快取畫面,還要解碼之後的畫面,通過前後畫面的與本幀資料的疊加取得最終的畫面。B幀壓縮率高,但是解碼時CPU會比較累 -
幀內(Intraframe)壓縮
:當壓縮一幀影象時,僅考慮本幀的資料而不考慮相鄰幀之間的冗餘資訊,幀內一般採用有失真壓縮演算法(幀內壓縮通過消除包含在每個獨立視訊幀內的色彩及結構中的冗餘資訊來進行壓縮,因此可在不降低圖片質量的情況下儘可能縮小尺寸,這類壓縮同JEPG壓縮原理類似。但通常用於對原始圖片的一部分進行處理以生成極高質量的照片。通過這一過程建立的幀稱為I-frames) -
幀間(Interframe)壓縮
:時間壓縮(Temporal compression),它通過比較時間軸上不同幀之間的資料進行壓縮。幀間壓縮一般是無損的(在幀內壓縮中,很多幀被組合在一起作為一組圖片(簡稱GOP),對於GOP所存在的時間維度的冗餘可以被消除。如果想象視訊檔案中的經典場景,就會有一些特定運動元素的概念,比如行駛的汽車或街上走路的行人,場景的背景環境通常是固定的,固定的背景環境就代表一個時間維度上的冗餘,這個冗餘就可以通過壓縮方式消除)
*muxing(合成)
:將視訊流、音訊流甚至是字幕流封裝到一個檔案中(容器格式(FLV
,TS
)),作為一個訊號進行傳輸。