cacti不能实时刷新流量图_介绍一种编码帧内刷新算法
0.引言
本文主要介紹一種幀內刷新算法,解決I幀太大帶來的延遲問題,可以在調優時,值得借鑒。
幀內刷新技術避免 I 幀尖峰帶來的帶寬壓力,可以有效地降低視頻通信中的緩沖區延遲。幀內刷新算法是一種視頻錯誤恢復的方法,通過對部分宏塊或者整幀采用強制幀內編碼的模式,從而斷開連續的幀間預測,所以之后的視頻幀不會再依賴之前的幀信息執行解碼操作,達到替代關鍵幀實現錯誤恢復的目的。
1.幀內刷新介紹
幀內刷新方法主要有隨機幀內刷新、自適應幀內刷新以及周期性幀內刷新技術。隨機幀內刷新在 P 幀中隨機選擇一部分 CTU 塊進行幀內編碼,因為該算法對幀內刷新塊的選擇是隨機的,所以效率較為低下,該方法雖然降低了編碼效率,但是對錯誤恢復能力的增加卻非常有限。自適應的幀內刷新技術主要是通過算法挑選感興趣區域的 CTU 塊進行強制幀內編碼,雖然該方法可以取得不錯的效果,但是現有的算法都比較復雜(如果能夠有這種計算力,實際也是可以使用),不利于實時視頻通信系統的實現。
周期性幀內刷新算法由于其簡單性和實用性被許多優秀的開源編碼器(如x264,x265等采用。在進行低延遲編碼時,視頻幀在 PIR 指定的刷新周期內被完全刷新,同樣對于每一幀,都有固定的宏塊進行幀內編碼,從而獲得比插入關鍵幀更平穩的比特率。在多媒體傳輸過程中,該方法并不使用關鍵幀來恢復傳輸中發生的錯誤,因此可以在提供低延遲特性的條件下又具備較好的容錯性,相比隨機幀內刷新更加有效。
周期性幀內刷新算法是通過將幀內編碼的columns 按照順序依次插入到每個P幀中來完成的。在該刷新方案中,首先根據給定的刷新周期大小 N 將整個幀劃分成 N 個區域。在
后面的編碼過程中,這些區域依次使用強制幀內編碼模式進行編碼。已經采用幀內編碼的區域稱為清潔區域(clean region),而正在進行幀內編碼(下圖中的 intra coded region)和尚未進行幀內編碼的區域都屬于臟區域(dirty region)。在編碼模式的判決過程中,編碼器首先需要判斷待編碼塊是否位于需要采用幀內編碼的區域,然后決定是否進行強制幀內編碼。整個視頻幀在一個刷新周期中可以被完全刷新,從而具備錯誤恢復的能力,可以有效地避免錯誤的傳播。例如,如果第一幀的第二列發生錯誤,則在第二幀中,第二列將使用幀內編碼模式進行編碼,因此可以立即消除錯誤。周期性幀內刷新算法如下圖:
但是只是采取上述刷新策略并不能完全恢復錯誤。在上圖中,當第一幀的第二列發生錯誤時,第二幀中的第二列使用幀內編碼模式進行編碼可以消除錯誤。但是當第二幀第一列中邊界附近的宏塊參考了第一幀第二列的數據時,則該錯誤仍然會在隨后的幀中傳播。當視頻的運動方向與幀內刷新方向相反時,這種情況會頻繁發生。因此為了保護清潔區域,在 PIR 方法中,除了上述對 columns 進行依次刷新的操作之外,還需要對已刷新區域進行搜索范圍的限制。也就是說,清潔區域不能參考臟區做運動估計,但是臟區可以使用先前幀的任何位置作為參考。幀內刷新方向如下圖:
雖然 PIR 方法簡單,適合實時通信的場景,但是該方法仍然存在一些不足之處,由于該方法對已刷新區域的搜索范圍的限制,當視頻運動方向與幀內刷新方向相反時,編碼性能將顯著降低。如上圖中,視頻的全局運動方向為從左向右,即左圖中處于灰色區域的編碼塊正常的進行運動估計時應當參考臟區的編碼塊,但由于 PIR 保護清潔區域的策略,使得處于清潔區的塊不能從臟區獲得預測,而必須從清潔區獲得參考塊,這樣會導致編碼中用到的運動矢量和實際的運動矢量不一致甚至相反,從而導致編碼性能的大幅度下降。針對這種問題,本文提出了一種基于 PIR 方法改進的運動自適應幀內刷新方法,該方案可以根據視頻運動方向自適應地選擇最佳刷新方向,可以有效地減少當視頻運動方向和刷新方向不一致時所帶來的率失真性能的下降。本文方案中的刷新周期的大小可以改變,并且不需要使用標準的 IP 編碼模式來獲得運動矢量信息,更加容易實現,同時這種方式能夠顯著地提升編碼的率的失真性能。
2.運動自適應幀內刷新算法
當視頻內容具有運動性,尤其是高速運動時,傳統的 PIR 方法無法獲得最優的編碼性能。為了防止錯誤傳播到清潔區域,當清潔區域的運動矢量(Motion Vector,MV)指向臟區域時,需要限制清潔區域的 MV,因此在這種情況下,清潔區域無法使用最優的 MV,如果運動矢量逆向的情況頻繁發生,就會導致視頻編碼性能的大幅下降。為了盡可能的避免這種情況發生,本文介紹一種運動自適應的幀內刷新算法如下圖:
首先,隨著近些年來視頻技術的發展,高清、超高清和 4K 及以上分辨率的視頻應用日益增多,因此對大分辨率視頻來說,視頻幀的不同區域可能具有不同的運動矢量,在本文的刷新方案中視頻幀被橫向劃分為四個矩形條帶(band),就像上圖所示,同時根據預先設定的刷新周期大小值 M,將每個 band 劃分為 M個區域(上圖中M=4)。在編碼過程中,每個 band 獨立地根據該 band的平均運動矢量信息計算兩種刷新方向帶來的運動矢量逆向成本(cost),完成 cost 的計算后,各個 band 可以根據本周期的計算信息自適應地選擇成本較低的刷新策略(從左到右或從右到左),并將選取的刷新策略應用于下一個刷新周期中。
3.運動矢量逆向成本
從下圖中可以看出該 band 的平均運動矢量為(x,y)=(3,0),示例中的刷新策略是從左向右。如上文所述,當清潔區域的 MV 指向臟區域時,其用于運動估計的 MV 將會受到限制,也可以理解為邊界保護,也就導致編碼性能的下降。在這種情況下,本文將性能的下降對應為產生的運動矢量逆向的成本,改進的算法需要選擇具有最小成本的策略作為每個 band 的刷新方向。
在下圖中,對于 Frame 1,Region 1 采用幀內編碼,因此 cost 為 0。對于 Frame 2,Region 1 屬于清潔區域,其 MV 指向臟區域(Region 2)。所以有必要防止 Region 1 從 Region 2 獲得參考信息,因此需要限制這個 MV,此時產生的 cost 為 3。對于Frame 3,Region 1 屬于清潔區域,但是其 MV 指向清潔區域(Region 2),Region 1 產生的 cost 為 0,同時 Region 2 屬于清潔區域,其 MV 指向臟區域(Region 3),Region 2 產生的 cost 為 3。而 Frame 4 中,只有 Region 3 會產生值為 3 的 cost,其他幾個區域的 cost 均為 0。如表 3-1 所示,在一個刷新周期中,該示例中所有幀的累計 cost 為 9。容易驗證,對此示例來說,最佳的幀內刷新方向是從右向左,這種刷新方式產生的累計 cost 為 0,可以避免率失真性能的下降。成本估算示例如下圖所示。所有區域的平均運動矢量(x,y)=(3,0),刷新方向是從左向右。
有些算法做法就是,在使用運動自適應的幀內刷新編碼之前,首先需要對相同視頻采用標準 IPPP 編碼得到運動矢量信息,然后才能根據得到的信息來決定合適的刷新策略。但是,這種方法顯然無法用于實際的低延遲視頻場景。本文介紹的方法是,在前一個刷新周期的運動矢量信息會被統計用于成本估算,根據成本計算的結果可以決定出下一刷新周期的刷新策略,這種方法是簡單而有效的。一個幀內刷新周期累計產生的cost 需要統計該周期中各幀、各區域的 MV 信息,如第 n 幀中的第 m(在本文中m=1,2,3,4)個 band 的 cost 函數定義如下:
Region i 和 Region j 是 band m 中的相鄰區域,如果 Region i 屬于清潔區域而Region j 是臟區域,并且 Region i 的運動矢量指向 Region j,其中MV xi是 Region i 的水平分量則產生的 cost 為:
對于其它情況:
運動矢量逆向成本可以用來衡量編碼效率的成本。因為運動矢量越大,也就意味著視頻的運動更為劇烈,所以在上一個幀內刷新周期內某區域發生運動矢量逆向,如果該區域的 MV 越大,則在新的幀內刷新周期中就越容易發生運動矢量逆向的情況,而且逆向發生時與原物體的距離越遠。
基于此,通過計算并累計一個刷新周期內所有幀產生的 cost,就可以獲得一個刷新周期內的總的運動矢量逆向成本,具體公式如下:
由于視頻數據在內容上具有時間上的連續性,因此可以將當前刷新周期的運動矢量逆向成本作為下一個刷新周期的運動矢量逆向成本的估計。在具體編碼時,通過上面公式分別計算兩個刷新策略(從左到右,從右到左)的 cost,然后在下一個刷新周期中為各個 band 選擇 cost 較小的刷新方向。運動自適應幀內刷新算法步驟如下:
(1)將視頻幀劃分為 4個band 并進行編碼,統計各個 band 的運動矢量信息。
(2)分別計算兩種刷新策略的 cost
本輪刷新未完成,跳到步驟(1)。
Region i 為清潔區域,Region j 為臟區, Region i 的 MV 指向 Region j:
否則
別計算本周期內兩種刷新方向的累計 cost:
(3)確定下一刷新周期的刷新策略。
分別為各個 b and 選取 cost 最小的刷新方向作為下一周期的刷新策略。
四個 b and 方向一致,跳轉到步驟1。
(4)檢驗豎直方向
選擇具有最大 cost 的 band 作為基準區域。相鄰區域(未曾比較的)的刷新方向與基準區域不一致,同時滿足:
則改變相鄰區域刷新方向,同時將該區域記為已比較。
所有區域均已比較,跳轉到步驟(1)中。
將相鄰區域設置為基準區域,跳轉到上面的計算公式:
當每個 band 的刷新方向相同時,可以直接進入下一個刷新周期進行編碼。但是,如果兩個相鄰 band 的刷新方向不一致時,則意味著這兩個 band 不能互相參考,可能在豎直方向也出現運動矢量逆向的情況。因此,當方向不一致時,有必要考察兩個相鄰 band 的相關性,以便為下一周期選擇最佳的刷新方向。
當兩個相鄰 band 刷新方向不一致時,本文采用如下策略確定兩個 band 的最終刷新方向:
(1)選擇成本較高的 band 作為基準。這是因為當成本較大時,更改刷新方向會導致編碼性能下降的更多,因此需要盡可能保持成本大的 band 不改變刷新方向。
(2)需要計算兩個相鄰 band 的平均運動矢量,以確定非基準 band 的刷新方向是否需要改變。假設 band i 和 band j 是具有不同刷新方向的兩個相鄰 band,同時 band i 是基準,如果它們的 MV 信息滿足以下公式中的條件,band j 的刷新方向則需要調整同 band i 一致:
其中MVyi 是 band i 指向 band j 的豎直分量,MVyj 是 band j 指向 band i 的豎直分量,MVxj 是 band j 的水平分量,本文所提的運動自適應幀內刷新算法的具體描述如上表所示。
4.首幀處理策略
本文的方案使用的是適用于低延遲場景的編碼結構,即編碼過程中只有第一幀是 I 幀,后續均為 P 幀。由于第一幀中的所有 CTU 塊都是采用幀內編碼模式,因此第一幀的碼率要比后續的 P 幀高很多。當第一幀通過固定速率信道時,傳輸時間將會更長,導致更大的視頻延遲,在互聯網場景下帶來的延遲更為明顯,會導致更大的延遲和網絡抖動。為了減少視頻傳輸延遲,第一幀(I 幀)的比特率必須降低。所以本文對第一個 I 幀做了如下處理。
在開啟碼控模式對 I 幀進行編碼時,可以通過減少給 I 幀分配的比特數來減少I 幀的數據量,從而避免 I 幀過高的碼率,減少緩沖區延遲。同時不可避免的是,I 幀比特數的降低會導致第一幀圖像質量的下降,因此在視頻開始時,視頻質量較低。但是在實時通信的場景中,第一幀的質量下降是可以接受的。更重要的是,采用幀內編碼的 columns 會陸續嵌入到后續的 P 幀中,從而可以在一個刷新周期內慢慢恢復視頻的質量。
本文采用 PSNR以及 SSIM 作為評價指標。實驗平臺為 HM16.14,編碼的配置采用 HM 提供的 low delay P 編碼結構,該配置文件編碼出的視頻碼流只有一個 I 幀,是適用于低延遲視頻應用的。CTU 的劃分使用默認的配置文件,CTU 大小為 64x64,最大可劃分深度為 4。
5.緩沖區充盈度分析
保持緩沖區不發生上溢和下溢的能力是衡量低延遲效果的關鍵指標之一。如果緩沖區累積的數據量過大,則編碼器必須跳過一些幀才能減少緩沖區延遲并防止發生緩沖區溢出的情況。相反,如果編碼器輸出比特率低于網絡帶寬,則會發生緩沖區下溢并導致帶寬浪費。為了適應傳輸信道的要求,實際場景要求視頻碼率的波動比較小。對相同的 P 幀而言,幀比特的抖動越小,碼流也就越平穩,越能適應較小的編碼緩沖區。對于恒定碼率編碼模式來說,只需要對一個 GOP 或者一段時間內編碼器輸出的碼流進行控制,保持一段時間內的碼率平穩,而在低延遲場景下,對于 IPPP 的編碼結構,需要連續的幾個 P 幀的比特數接近,不產生較大的震蕩,才能夠適應對延遲比較苛刻的實時通信場景。下面公式中描述了編碼緩沖區大小與延遲和碼率之間的關系:
其中DelayT 是實時視頻碼流的延遲時間,TargetR 是編碼的目標碼率。為了考察兩種方法的低延遲效果,DelayT 在實驗中設定為兩幀,例如,對于幀率為 25FPS 的視頻來說,兩幀的延遲為 80ms。
PIR 方法和本章所提算法實際編碼的效果如下圖所示,需要說明的是,PIR方法的導致的性能損失主要是由于邊界塊(在圖中用紅色方框標記)的運動估計搜索范圍是被限制的。傳統方法幀內刷新的刷新方向是從左到右,此時,運動矢量逆向的情況頻繁發生,邊界塊較多的采用幀內編碼模式,導致編碼性能有較大損失。第一個 band 的刷新方向與 PIR 方法一致,也是從左向右,而后三個 band 的刷新方向是從右向左。可以看出,所提方案避免了頻繁幀內編碼的情況,因此與 PIR 方法相比具有更好的效果,可以獲得性能的提升。
6.總結
該方案通過統計編碼數據的運動矢量信息,通過計算一個周期內不同刷新方向的運動矢量逆向成本,從而決定出下一刷新周期最合適的刷新策略,根據視頻運動方向自適應地選擇最優刷新策略。相同水平的低延遲效果的情況下,可以獲得更優的率失真性能,盡可能的避免了運動矢量逆向情況的出現,對于運動顯著的序列可以獲得更高的率失真增益。本文方案算法的時間復雜度與周期性幀內刷新方法相當,額外增加的成本估算部分對整體編碼時間的影響較小。歡迎關注,收藏,轉發,分享。
后期關于項目知識,也會更新在微信公眾號“記錄世界 from antonio”,歡迎關注
總結
以上是生活随笔為你收集整理的cacti不能实时刷新流量图_介绍一种编码帧内刷新算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果手机关手电快捷键(苹果手机怎么快捷关
- 下一篇: 按钮自动居中布局_CSS布局技巧