ios 视频知识补充---分解LFLiveKit
視頻:泛指將一系列的靜態影像以電信號的方式捕捉、記錄、處理、儲存、傳送、重現的各種技術。連續的靜態圖像變化每秒超過24幀(frame)以上時,由于視覺殘留,人眼無法識別單獨的靜態圖片,此時看上去就是平滑且連續的效果,這種連續的影像畫面可以稱之為視頻。
幀:視頻是由一幀一幀的靜態圖片連續播放形成的,故一幀就是視頻中一個靜態的畫面。(可以理解為由一張一張的圖片,在視頻范疇稱為“幀”,圖片稱為“靜態畫面”)
關鍵幀:也稱之為 I 幀,是幀間壓縮編碼的最重要的幀。視頻的編碼是按照“組”進行的,每一個組叫"GOP(Group Of Picture,圖像組)",而GOP與GOP之間沒有聯系,編碼的關系只在一個GOP之間處理,關鍵幀是一幅完整的畫面,GOP之間的幀都是不完整的,需要關鍵幀、前面幀、后面幀等一起運算得到。關鍵幀的間隔條件會影響到GOP的長度,繼而影響到讀取GOP的速度,如果關鍵幀間隔設置過大,在必須用到關鍵幀的場景就可能需要B/P幀來代替,這樣會降低畫面質量。關鍵幀是幀間壓縮的基礎,典型的GOP結構是?IBBPBBPBBPBBPBBPBB
前后參考幀:也稱之為 B 幀,參考前面、后面兩幀的數據加上本幀的變化得到本幀的數據
向前參考幀:也稱之為 P 幀,如果 I 幀損壞,整個GOP就損壞了。即IBBPBBPBBPBBPBBPBB這么多幀一起壞掉,設置再長的時間間隔,編碼出的數據也不穩定。
?
拓展:
I 幀是幀內壓縮? 而P、B幀是幀間壓縮,以I幀為基礎,預測P幀,以I、P幀為基礎預測B幀,最后將I幀數據和預測的差值存儲和傳輸。
幀率:一秒內傳輸圖片的幀數,也可以理解為圖形處理器每秒鐘能夠刷新幾次,通常用fps(Frames Per Second)表示。高的幀率可以得到更流暢、更逼真的動畫。每秒鐘幀數 (fps) 愈多,所顯示的動作就會愈流暢。
FPS越高對顯卡的性能要求越高,電腦中顯示的圖片都是有顯卡輸出的,屏幕上每個像素點的填充都是有顯卡進行計算并輸出的。假定一個圖片分辨率1024x768,頁面幀率設置24fps,那么顯卡一秒內要處理的像素點為1024x768x24個。顯卡處理能力=分辨率x幀率
一般平均來說,I的壓縮率是7(跟JPG差不多),P是20,B可以達到50,可見使用B幀能節省大量空間,節省出來的空間可以用來保存多一些I幀,這樣在相同碼率下,可以提供更好的畫質。
?I、B、P各幀是根據壓縮算法的需要,是人為定義的,它們都是實實在在的物理幀,至于圖像中的哪一幀是I幀,是隨機的,一但確定了I幀,以后的各幀就嚴格按規定順序排列。
在H.264視頻編碼標準中,系統框架分為兩個層面:VCL( 視頻編碼層面) 和 NAL(網絡抽象層),前者表示視頻數據內容,后者負責格式化數據并提供頭信息,以保證數據適合在各種信道和存儲介質上傳輸。每幀數據就是一個NAL單元(SPS和PPS除外),在實際的H264數據幀中,往往幀前面帶有00 00 00 01 或 00 00 01分隔符,一般來說編碼器編出的首幀數據為SPS與PPS,接著為I幀……
NALU:?全稱Network Abstract Layer Unit (網絡抽象層單元),包含一個字節的頭信息和一系列來自VCL稱為原始字節序列的字節流(RBSP),H264在網絡上傳輸的是NALU,NALU的結構:NAL頭+RBSP
SPS:?H.264碼流第一個 NALU是 SPS(序列參數集Sequence Parameter Set)
SPS中保存了一組編碼視頻序列(Coded video sequence)的全局參數。所謂的編碼視頻序列即原始視頻的一幀一幀的像素數據經過編碼之后的結構組成的序列。而每一幀的編碼后數據所依賴的參數保存于圖像參數集中。一般情況SPS和PPS的NAL Unit通常位于整個碼流的起始位置。但在某些特殊情況下,在碼流中間也可能出現這兩種結構,主要原因可能為:
- 解碼器需要在碼流中間開始解碼;
- 編碼器在編碼的過程中改變了碼流的參數(如圖像分辨率等);
在做視頻播放器時,為了讓后續的解碼過程可以使用SPS中包含的參數,必須對其中的數據進行解析。
PPS:?H.264碼流第二個 NALU是 PPS(圖像參數集Picture Parameter Set)
通常情況下,PPS類似于SPS,在H.264的裸碼流中單獨保存在一個NAL Unit中,只是PPS NAL Unit的nal_unit_type值為8;而在封裝格式中,PPS通常與SPS一起,保存在視頻文件的文件頭中。
IDR:??H.264碼流第三個 NALU 是 IDR(即時解碼器刷新)
H2.64中I幀和IDR幀的區別 I和IDR幀都是使用幀內預測的。它們都是同一個東西而已,在編碼和解碼中為了方便,要首個I幀和其他I幀區別開,所以才把第一個首個I幀叫IDR,這樣就方便控制編碼和解碼流程。IDR幀的作用是立刻刷新,使錯誤不致傳播,從IDR幀開始,重新算一個新的序列開始編碼。而I幀不具有隨機訪問的能力,這個功能是由IDR承擔,IDR會導致DPB(參考幀列表——這是關鍵所在)清空,而I不會。IDR圖像一定是I圖像,但I圖像不一定是IDR圖像。一個序列中可以有很多的I圖像,I圖像之后的圖象可以引用I圖像之間的圖像做運動參考。對于IDR幀來說,在IDR幀之后的所有幀都不能引用任何IDR幀之前的幀的內容,與此相反,對于普通的I-幀來說,位于其之后的B-和P-幀可以引用位于普通I-幀之前的I-幀。從隨機存取的視頻流中,播放器永遠可以從一個IDR幀播放,因為在它之后沒有任何幀引用之前的幀。但是,不能在一個沒有IDR幀的視頻中從任意點開始播放,因為后面的幀總是會引用前面的幀。 (http://blog.csdn.net/leixiaohua1020/article/details/11800877)?
以上信息,各種百度。。。。。。
?
轉載于:https://www.cnblogs.com/madaha/p/9713170.html
總結
以上是生活随笔為你收集整理的ios 视频知识补充---分解LFLiveKit的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linuxsed替换字符串后保存_Num
- 下一篇: mongodump 备份还原